grep を使用して、移動する必要があるファイルのリストを生成しています。
grep -L -r 'Subject: \[SPAM\]' .
このリストを mv コマンドに渡して、ファイルを別の場所に移動するにはどうすればよいですか?
パターンに一致しないファイルを見つけて移動する場合('Subject \[SPAM\]'
この例では含まれていないファイルを移動する場合)は、次を使用します。
grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR
-Zは、ファイル名の後にゼロ(\ 0)が付いた出力を意味します(したがって、スペースは区切り文字として使用されません)。
xargs -0
\0を区切り文字として解釈することを意味します。
-Lは、パターンに一致しないファイルを検索することを意味します。-L
パターンに一致するファイルを移動する-l
場合は、に置き換えます。
それで
-I{} mv {} DIR
{}
ファイル名に置き換えることを意味するので、を取得しmv filenames DIR
ます。
この代替手段は、xargs が利用できない場合に機能します。
grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done
これは私が Fedora Core 12 で使用するものです:
grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
これが私を助けたものです:
grep -lir 'spam' ./ | xargs mv -t ../spam
もちろん、私はすでに必要なフォルダーにいて(そのため./
)、それらを隣のフォルダーに移動しました。ただし、それらを任意のパスに変更できます。
受け入れられた答えがうまくいかなかった理由がわかりません。また、ファイル名にスペースや特殊文字が含まれていませんでした。これは機能しない可能性があります。
ここで盗まれました:テキスト文字列を含むファイルを見つけて移動するgrepコマンド
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>
あなたが書いたgrepがあなたが期待しているファイルパスを返すと仮定します。
多分これはうまくいくでしょう:
mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
いくつかの方法がありますが、ここに遅いがフェイルセーフな方法があります:
IFS=$'\n'; # set the field separator to line break
for $mail in $(grep -L -r 'Subject: \[SPAM\]' .); do mv "$mail" your_dir; done;
IFS=' '; # restore FS
私にぴったりの仕事:
MYSTRINGTOSEARCH という単語を含むテキストを含むファイルをディレクトリ MYDIR に移動します。
探す 。-type f -exec grep -il 'MYSTRINGTOSEARCH' {} \; -exec mv {} MYDIR/ \;
これが役立つことを願っています
grep ... | を使用して、結果を次のコマンドに渡すことができます。xargs mv {} 宛先
詳細については、man xargs を確認してください。