以下を使用して、特定のテキスト文字列を含むフォルダ内のファイルを検索できます。
grep -lir 'string' ~/directory/*
上記の結果に表示されるファイルを別の場所に移動するにはどうすればよいですか?
答え1
3番目の構文でxargs
使用されます。mv
mv [OPTION]... -t DIRECTORY SOURCE...
grep -lir 'string' ~/directory/* | xargs mv -t DEST
特殊文字(スペース、引用符)を含むファイルに注意してください。この場合、フィルタリングされたリストを使用するとsed
(ファイル名の周りに引用符を追加するs/^/'/;s/$/'/
)ことができますが、これらの引用符がファイル名に表示されないようにする必要があります。 GNUには、NULで終わるファイル名の/オプションがgrep
あります。-Z
--null
3番目の構文の代替案は、プレースホルダ文字列()で使用することですmv
。xargs
-I
もう1つのオプションは、ire_and_cursesの答えで述べたように、コマンドの置き換えまたは$( )
バックティック``
です。
答え2
いつものように注意してくださいgrep -r
。-r
標準オプションではなく、最新バージョンのGNUを除くいくつかの実装では、grep
ディレクトリツリーを下げるときに通常は望ましくないシンボリックリンクに従います。ディレクトリツリーのどこかに深刻な結果をもたらす可能性があります。」
Unix哲学では、あるコマンドを使用してディレクトリからファイルを検索し、別のコマンドを使用してその内容を表示します。
GNUツールを使用すると、次のことができます。
xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
) mv -i --target-directory /dest/dir
ただし、他のユーザーが書き込むことができるディレクトリで1人のユーザーとして実行している場合は、競合状態と発生する可能性があるセキュリティの問題に注意してください。
答え3
\[*?
ファイル名に特殊文字(スペースまたは)が含まれていない場合は、以下を使用してください。コマンドの置き換え:
mv `grep -lir 'string' ~/directory/*` destination/
答え4
使用GNUパラレル:
grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'
ht/ @lin-dongのxargsに対する元の答えです。