1. ホーム
  2. bash

[解決済み] bashスクリプトでfindコマンドを使用する

2022-03-02 05:26:09

質問

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

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

このコードはpdfタイプで動作しますが、私は.txtまたは.bmpのような複数のファイルタイプを一緒に検索したいです。

解決方法は?

bashへようこそ。古くて暗くて神秘的なもので、大きな魔法を使うことができます :-)

ご質問のオプションは find コマンドで、bashではありません。 コマンドラインから man find をクリックすると、オプションが表示されます。

お目当てのものは -o は "または"です。

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

そういえば こんなことしちゃダメだ。 このようなストレージは、単純なファイル名には有効かもしれませんが、スペースや改行などの特殊文字を扱わなければならない時点で、すべての賭けは失敗に終わります。参照 パースLs をご覧ください。

$ 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でプログラミングするための素晴らしいヒントがたくさんあります。