2011-12-14 3 views
14

난 그냥 bash 스크립트를 사용하기 시작하고 find 명령을 두 개 이상의 파일 유형과 함께 사용해야합니다.bash 스크립트에서 find 명령 사용

list=$(find /home/user/Desktop -name '*.pdf') 

PDF 타입에 대해,이 코드가 작동하지만 난이 .txt와 같은 하나 이상의 파일 형식을 검색하거나 together.Have 당신에게 어떤 생각을 .bmp로 싶어?

답변

19

bash에 오신 것을 환영합니다. 그것은 늙고, 어둡고 신비한 것입니다. 위대한 마술을 할 수 있습니다. :-)

당신이 물어 보는 옵션은 bash가 아니라 find 명령입니다. 명령 줄에서 man find을 사용하여 옵션을 볼 수 있습니다.

당신이 찾고있는 하나 "또는"에 대한 -o입니다 :

말했다
list="$(find /home/user/Desktop -name '*.bmp' -o -name '*.txt')" 

... 이 작업을 수행하지 마십시오. 이와 같은 저장소는 단순한 파일 이름에서도 작동하지만 공백과 개행 같은 특수 문자를 처리하자마자 모든 베팅은 해제됩니다. 자세한 내용은 ParsingLs을 참조하십시오.

$ touch 'one.txt' 'two three.txt' 'foo.bmp' 
$ list="$(find . -name \*.txt -o -name \*.bmp -type f)" 
$ for file in $list; do if [ ! -f "$file" ]; then echo "MISSING: $file"; fi; done 
MISSING: ./two 
MISSING: three.txt 

경로 이름 확장 (globbing)은 파일을 훨씬 더 안전하게 추적 할 수있는 방법을 제공합니다. 그럼 당신은 bash는 배열을 사용할 수 있습니다

$ a=(*.txt *.bmp) 
$ declare -p a 
declare -a a=([0]="one.txt" [1]="two three.txt" [2]="foo.bmp") 
$ for file in "${a[@]}"; do ls -l "$file"; done 
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 one.txt 
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 two three.txt 
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 foo.bmp 

Bash FAQ bash는 프로그래밍에 대한 다른 좋은 팁 많이 있습니다.

3

이를 사용할 수 있습니다

list=$(find /home/user/Desktop -name '*.pdf' -o -name '*.txt' -o -name '*.bmp') 

게다가, 당신은뿐만 아니라 ".PDF"(대문자) 확장자를 가진 파일을 잡으려고 -iname 대신 -name의를 사용할 수도 있습니다.

+2

당신이 따옴표를 사용해야합니다 공백이있는 파일 이름에 대처하려면' $ list'에서 for i와 같이 나중에 $ list' 변수를 사용합니다; do echo $ i; 다. 큰 따옴표를 쓰지 않으면 스크립트는 각 "파일 이름 this.jpg"를 "파일 이름", "좋아요"및 "this.jpg"의 세 파일로 간주합니다. – ash108

관련 문제