web-dev-qa-db-ja.com

bashスクリプトでfindコマンドを使用する

Bashスクリプトの使用を開始しましたが、複数のファイルタイプでfindコマンドを使用する必要があります。

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

このコードはpdfタイプで機能しますが、.txtや.bmpなどの複数のファイルタイプを一緒に検索したいのですが、何かアイデアはありますか?

20
justuser

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

パス名の展開(グロビング)は、ファイルを追跡するためのはるかに優れた/安全な方法を提供します。次に、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でのプログラミングに関する他の優れたヒントがたくさんあります。

34
ghoti

「見つけた」ものをループしたい場合は、これを使用する必要があります。

find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
    printf '%s\n' "$file"
done

ソース: https://askubuntu.com/questions/343727/filenames-with-spaces-breaking-for-loop-find-command

8
Vivek Sethi

これを使用できます:

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

また、-iname の代わりに -name「.PDF」(大文字)拡張子のファイルもキャッチします。

3
ash108