2011-12-14 19 views
14

私はちょうどbashスクリプトを使い始めました。私は複数のファイルタイプでfindコマンドを使う必要があります。bashスクリプトでfindコマンドを使用する

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

PDFタイプについて、このコードの作品が、私は、.txtのような複数のファイルタイプを検索したり、あなたのすべてのアイデアをtogether.Haveを.BMPしたいですか?

答えて

19

bashへようこそ。古くて暗くて不思議なものです。素晴らしい魔法が可能です。 :-)

あなたが尋ねるオプションは、findコマンドですが、bashでは使用できません。コマンドラインから、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 

パス名の拡張(グロビング)は、ファイルの追跡をはるかに優れた、より安全な方法を提供します。そして、あなたはまた、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'変数を使用します。 echo $ iを実行します。完了しました。二重引用符を使用しない場合、スクリプトはそれぞれの "ファイル名this.jpg"を "ファイル名"、 "好き"、 "this.jpg"の3つのファイルと見なします。 – ash108

関連する問題