2011-12-14 32 views
14

Tôi chỉ bắt đầu sử dụng tập lệnh bash và tôi cần sử dụng lệnh find với nhiều loại tệp.Sử dụng lệnh find trong bash script

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

mã này hoạt động cho loại pdf nhưng tôi muốn tìm kiếm nhiều loại tệp như .txt hoặc .bmp together.Bạn có ý tưởng gì không?

Trả lời

19

Chào mừng bạn đến bash. Đó là một điều cũ, tối và bí ẩn, có khả năng ma thuật tuyệt vời. :-)

Các tùy chọn mà bạn đang hỏi về là cho lệnh find tuy nhiên, không phải cho bash. Từ dòng lệnh của bạn, bạn có thể man find để xem các tùy chọn.

Một bạn đang muốn tìm -o cho "hoặc":

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

Điều đó nói rằng ... Đừng làm điều này. Lưu trữ như thế này có thể làm việc cho tên tập tin đơn giản, nhưng ngay sau khi bạn phải đối phó với các ký tự đặc biệt, như dấu cách và dòng mới, tất cả các cược được tắt. Xem ParsingLs để biết chi tiết.

$ 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 

Mở rộng tên đường dẫn (globbing) cung cấp cách tốt hơn/an toàn hơn để theo dõi tệp. Sau đó, bạn cũng có thể sử dụng các mảng 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 có nhiều mẹo tuyệt vời khác về lập trình trong bash.

3

Bạn có thể sử dụng này:

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

Bên cạnh đó, bạn có thể muốn sử dụng -iname thay vì -name để bắt các tập tin với ".PDF" (chữ hoa) mở rộng là tốt.

+2

Để đối phó với tên tập tin với không gian bạn sẽ cần phải sử dụng dấu ngoặc kép cho môi trường ' $ list' biến sau, như trong 'for i in" $ list "; echo $ i; done'. Nếu không có dấu nháy kép, tập lệnh của bạn sẽ xem xét từng "tên tệp như this.jpg" dưới dạng ba tệp: "tên tệp", "như" và "this.jpg". – ash108

Các vấn đề liên quan