簡単に言うと、約 800,000 個の PHP ファイルを含むフォルダーがあります。各ファイルで文字列を検索し、そのファイルに存在する場合は、そのファイルを別のディレクトリにコピーしたいと思います。
これはターミナルから可能ですか?
これまでに得たもの:
grep -i -n -r 'ppr-1792' * | cp $1 ここへ移動
しかし、これは明らかに機能しません。$1 は、一致するテキストを含むファイル名である必要があります。
どうすればいいですか?
答え1
for ループを使用して grep の戻りコードをテストしたり、grep -c
(count matches) を使用して一致数が 1 より大きいかどうかを確認したりできます。
例えば
for i in *
do
grep -i -n 'Power' "$i"
if [ "$?" -eq 0 ]
then
cp "$i" mvd
fi
done
答え2
ワンライナーで簡単に実行できます:
grep -l -i -r -Z pattern | xargs -0 -I source cp source /target
動作の仕組みについていくつかコメントします。Grep の -l オプションは、ファイル内に一致するものがある場合、ファイル名だけを出力します。つまり、コピーするファイルのリストを生成します。Xargs コマンドは、各コピー コマンドのコマンドを構築して実行します。Xargs は、"source" という名前の引数を標準入力から読み取ったファイル名に置き換えます。ファイル名内のスペースやその他の奇妙な文字は、-Z および -0 オプションで処理されます。