제4 편: 파일 이름 일치/출력 방향 변경

5813 단어 linux직장레저
 파일 이름 일치
파일 이름 이 일치 하면 이름 을 일일이 쓰 지 않 아 도 여러 파일 을 지정 할 수 있 습 니 다.마스크 (wildcards) 라 는 특수 한 문 자 를 사용 할 것 입 니 다.
'rm' 명령 으로 디 렉 터 리 아래 문자열 'bak' 로 끝 나 는 모든 파일 을 삭제 하고 싶다 고 가정 합 니 다.'rm' 뒤에 있 는 모든 파일 이름 을 매개 변수 로 하 는 것 외 에 도 마스크 '*' 를 사용 할 수 있 습 니 다.rm *.bak
 
'*' 는 하나 이상 의 문자 와 일치 할 수 있 습 니 다.이 예 에서 셸 에 게 명령 'rm' 의 인 자 를 '*. bak' 로 끝 나 는 모든 파일 '로 확장 하 라 고 알려 주 십시오. 셸 은 확 장 된 인 자 를' rm '명령 에 알려 줍 니 다.
셸 이 명령 을 실행 하기 전에 명령 줄 을 읽 고 설명 하 는 것 을 볼 수 있 습 니 다.이것 때문에 셸 명령 의 인자 에 어댑터 를 사용 할 수 있 습 니 다.
우 리 는 더욱 진일보 해서 마스크 '*' 를 알 게 되 었 다.파일 '124. bak', '346. bak', '583. bak' 등 디 렉 터 리 가 있다 고 가정 합 니 다.'583. bak' 파일 만 저장 하려 면:rm *4*.bak
 
셸 은 '* 4 *. bak' 을 '4' 를 포함 하고 'bak' 로 끝 나 는 모든 문자열 '로 확장 합 니 다.
rm 4 *. bak 에서 작업 할 수 없습니다. '4' 로 시작 하 는 파일 과 일치 하기 때 문 입 니 다.디 렉 터 리 에 이러한 파일 이 없 기 때문에 셸 은 이 모드 를 빈 문자열 로 확장 하기 때문에 'rm' 은 오류 정 보 를 되 돌려 줍 니 다.rm: cannot remove `4*.bak': No such file or directory
 
'345. bak' 파일 을 보관 하고 싶 으 면 '124. bak' 과 '583. bak' 을 삭제 하 십시오.삭 제 된 파일 의 이름 은 접 두 사 를 제외 하고 다 르 기 때문에 좀 어려워 보인다.다행히도 파일 을 지정 할 수 있 습 니 다:rm *[!6].bak
 
'6. bak' 로 끝 나 는 파일 을 제외 하고 'bak' 로 끝 나 는 모든 파일 을 삭제 합 니 다.반 호 (negation sign) 와 반 문자 (여 기 는 6) 를 괄호 에 넣 어야 합 니 다. 그렇지 않 으 면 셸 은 느낌표 (exclamation mark) 를 역사 기록 교체 의 시작 (the beginning of a history substitution) 으로 해석 합 니 다.반 호 를 취 하 는 것 은 이 편 에서 소개 한 모든 일치 모드 에서 유효 합 니 다.
주의: 마스크 '*' 와 반 호 를 연결 하면 문제 가 발생 하기 쉽 습 니 다.알아맞히다rm *[!6]*.bak
무슨 뜻 이에 요?이 명령 은 이름 에 '6' 이 포 함 된 파일 까지 모든 파일 을 삭제 합 니 다.마스크 '*' 를 반 호 를 가 져 오 는 앞 과 뒤에 놓 으 면 실제 반 호 를 가 져 오 는 것 은 실 효 됩 니 다. 셸 은 이 문 자 를 포함 하지 않 는 모든 이름 의 파일 로 해석 하기 때 문 입 니 다.우리 의 예 에서 파일 '666. bak' 만 이 모드 에 맞지 않 습 니 다.
 
두 번 째 마스크 는 물음표 (question mark): '?' 입 니 다.일치 할 때 하나의 물음표 가 한 글자 만 대표 할 수 있 습 니 다.그 용 도 를 시범 하기 위해 서, 우 리 는 상례 의 가설 에 '311. bak ~' 와 'some. text' 두 개의 새 파일 을 추가 합 니 다.현재, 점 뒤에 네 글자 가 있 는 모든 파일 을 보 여 줍 니 다:ls *.????
 
물음표 어댑터 는 위 에서 언급 한 '반 호 함정' (negation trap) 을 효과적으로 피 할 수 있 습 니 다.rm *[!4]?.*
 
'점 호 를 제외 한 마지막 두 번 째 문자 가' 4 '인 모든 파일' 로 확장 합 니 다. 즉, 파일 '346. bak' 만 유지 합 니 다.
다른 일치 하 는 방법 이 있 습 니까?지금까지 지정 한 위치 에서 유일한 문자 와 일치 하 는 방법 만 보 았 습 니 다.하지만 당신 도 그 럴 수 있 습 니 다.ls [13]*
 
문자 '1' 또는 '3' 로 시작 하 는 모든 파일 을 보 여 줍 니 다.우리 의 예 에서 파일 '124. bak', '311. bak ~' 는 '346. bak' 와 일치 합 니 다.일치 하 는 패턴 을 괄호 로 묶 어야 합 니 다. 그렇지 않 으 면 문자열 '13' 로 시작 하 는 파일 만 일치 합 니 다.
다음은 일치 하 는 범 위 를 정의 할 수 있 는 것 을 기 쁘 게 보 게 될 것 입 니 다.ls *[3-8]?.*
 
모든 점 수 를 표시 하기 전에 두 번 째 문 자 를 '3' 에서 '8' 범위 에 떨 어 뜨 린 파일 입 니 다.우리 의 예 에서 일치 하 는 파일 은 '346. bak' 과 '583. bak' 입 니 다.2. 셸 의 특수 문 자 를 참조 합 니 다.
그러나 위의 메커니즘 들 은 셸 이 명령 을 실행 하기 전에 확장 을 시도 하 는 단점 이 있다.때로는 까다 로 워 진다.l 文件名包含特殊字符。假设您在那个目录中还有一个名为'!56.bak'的文件。下面试图进行模式匹配:
rm !*
rm
rm: too few arguments

 
셸 장 '! *'일치 하 는 방식 이 아니 라 과거 기록 의 교체 로 해석 합 니 다.
l 명령 자체 에 특수 문 자 를 매개 변수 로 합 니 다.일부 Linux 에서 명령 행 도구, 예 를 들 어 (e) grep, sed, awk, find 및 locate 는 모두 자신의 정규 표현 식 (regular expressions) 을 사용 합 니 다.이 표현 식 들 은 패턴 과 일치 하 는 것 이 놀 라 울 정도 로 비슷 하지만, 어떤 곳 에 서 는 또 다르다.
그러나 이 특수 명령 을 적용 하기 위해 셸 은 먼저 패턴 으로 설명 할 수 없습니다.find . -name [1-9]* -print
find: paths must precede expression

아마도:find . -name '[1-9]*' -print
./346.bak
./124.bak
./583.bak
./311.bak~

 
반사 선 (back slash) 을 통 해 특수 문 자 를 참조 할 수 있 습 니 다. 예 를 들 어!, $,?빈 칸:ls ..!*
!56.bak

 
따옴표 사용 하기:ls '!'*
!56.bak

 
따옴표 가 어디 에 두 어야 하 는 지 잘 보 세 요.명령 ls'! * ''! *'의 파일 입 니 다. 이것 은 마스크 도 따옴표 사이 에 있 기 때문에 글자 에 따라 설명 할 수 밖 에 없습니다.3. 출력 재 설정
유 닉 스 의 이념 은 많은 작은 프로그램 을 모 으 는 것 이 고 모든 것 에 특별한 특 기 를 가진다.복잡 한 임 무 는 대형 소프트웨어 가 완성 하 는 것 이 아니 라 셸 의 체 제 를 활용 하여 많은 작은 프로그램 을 조합 하여 공동으로 완성 하 는 것 이다.방향 을 바 꾸 는 것 은 그 중에서 중요 한 역할 을 발휘 하고 있다.1. 여러 명령 사이 에서 방향 을 바 꿉 니 다.
이것 은 파이프 (pipe) 를 통 해 파이프 기호 | 로 표시 해 야 한다.문법 은:command1 | command2 | command3 等等
 
이런 격식 은 이미 보 셨 을 겁 니 다.파 이 프 는 항상 프로그램의 출력 을 'more' 나 'less' 로 보 내 읽 습 니 다.ls -l | less
 
그 중에서 첫 번 째 명령 은 디 렉 터 리 내용 을 제공 하고 두 번 째 명령 은 페이지 를 넘 기 는 방식 으로 표시 합 니 다.더 복잡 한 예:rpm -qa | grep ^x | less
 
첫 번 째 명령 은 설 치 된 RPM 패 키 지 를 모두 주 고, 두 번 째 명령 은 필터 (filter: grep) 를 주 며, '^ x' 로 시작 하 는 패 키 지 를 남 겨 두 고, 세 번 째 명령 은 결 과 를 페이지 를 넘 기 는 방식 으로 표시 합 니 다.
2. 파일 로 재 설정
명령 의 출력 결 과 를 파일 에 저장 하거나 파일 내용 을 명령 의 매개 변수 로 사용 하고 싶 을 때 가 있 습 니 다.이것 은 '>' 와 '<' 를 통 해 이 루어 질 수 있다.command > file
 
command 의 출력 을 file 에 저장 합 니 다. 이것 은 file 의 내용 을 덮어 씁 니 다.ls > dirlist
 
현재 디 렉 터 리 의 내용 을 'dirlist' 파일 에 저장 합 니 다.command < file
 
file 내용 을 command 로 입력:sort < dirlist > sdirlist
 
파일 'dirlist' 의 내용 을 명령 'sor' 로 보 낸 다음 정렬 된 결 과 를 파일 'sdirlist' 로 보 냅 니 다.물론 당신 도 한 걸음 에 도착 할 수 있 습 니 다.ls | sort > sdirlist
 
특수 한 방식 은 'command 2 > file' 이다.이것 은 command 에서 실 행 된 오류 정 보 를 file 에 보 냅 니 다.이 건 그때 필요 하 실 거 예요.
다른 조작 자 는 '>' 입 니 다. 출력 을 존재 하 는 파일 에 추가 합 니 다:echo "string" >> file
 
string 을 파일 file 에 추가 합 니 다.이것 은 파일 을 열지 않 고 편집 을 완성 하 는 좋 은 방법 입 니 다!
그러나 '<' 와 '>' 연산 자 는 모두 중요 한 제한 이 있다.command < file1 > file1
 
file 1 의 내용 을 삭제 합 니 다.command < file1 >> file1
 
잘 작 동 하여 가 공 된 file 1 내용 을 파일 에 추가 할 수 있 습 니 다.
좀 많 지 않 아 요?당황 하지 마 세 요. 당신 은 자신의 속도 에 따라 한 걸음 한 걸음 공부 할 수 있 습 니 다.실천 이 가장 좋 은 학습 방법 이라는 것 을 잊 지 마 세 요.
많은 셸 의 메커니즘 을 숙지 한 후에 환경 을 맞 추 는 방법 을 급히 알 고 싶 어 할 수도 있 습 니 다.뒤의 두 편 에서 당신 은 이 방면 의 계 시 를 얻 을 수 있 을 것 입 니 다.마지막 편 에 서 는 셸 오류 정 보 를 어떻게 처리 하 는 지 에 대한 일반적인 문답 (FAQ) 과 설정 기법 도 있다.

좋은 웹페이지 즐겨찾기