BASHシェルからファイルの行を取得したいです(例:パターン.txt)名前にファイルの各行にパターンが含まれているファイルを自分のシステムで見つけます。だから私は次のforループを持っています:
for pp in `cat pattern.txt`; do find ./ -iname "*${pp}*" -print0; done
最初の行が次のような場合、ファイルが見つかりません。パターン.txt存在します。それでは、上記のコマンドラインを修正する方法は?
注:ファイル内の各行には[a-zA-Z]文字のみが含まれています。
答え1
これは、ファイルから検索された複数のファイル名パターンを見つけるための安全なWindows保護されていません。私が選んだのは、パターンリストを式として扱うことでしたfind
。
find_expression=$(<pattern \
sed -e 's/^/-o\n-iname\n*/' \
-e 's/\r\?$/*/' | # turn each pattern into -o -iname *foo*
tail -n +2) # remove spurious initial -o
set -f # turn off globbing
IFS='
' # split only at newlines
find . \( $find_expression \) -print0
set +f; unset IFS # restore defaults
答え2
この試み:
#!/bin/bash
while IFS= read -r pp; do
find . -iname "*${pp}*" -print0
done < /path/to/pattern.txt
なぜそれを望んだのか分からないが、-print0
とにかく残した。たぶんあなたはそれをパイプで接続しようとしますかxargs
?
答え3
@SiegeXが提供した答えはうまくいきますが、スキーマファイルにファイルが多いと速度が遅くなり、扱いにくくなる可能性があります。次のようなさまざまなツールを使用すると、より良いパフォーマンスが得られます。
find . | grep -f pattern.txt
はい、それはすべてです。