web-dev-qa-db-ja.com

grepを使用してファイル内のコンテンツを見つけ、一致する場合は移動します

私はgrepを使用して、移動する必要があるファイルのリストを生成しています。

grep -L -r 'Subject: \[SPAM\]' .

このリストをmvコマンドに渡し、ファイルを別の場所に移動するにはどうすればよいですか?

50
user17582
grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR

-Zは、ファイル名の後にゼロ(\ 0)が付いた出力を意味します(したがって、スペースは区切り文字として使用されません)。

xargs -0

\ 0を区切り文字として解釈することを意味します。

それから

-I{} mv {} DIR

{}をファイル名に置き換えることを意味し、mv filenames DIRを取得します。

73
daveb

この代替は、xa​​rgsが使用できない場合に機能します。

grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done
18
Tobias Kunze

これは私を助けたものです:

grep -lir 'spam' ./ | xargs mv -t ../spam

もちろん、私はすでに必要なフォルダにいました(だから./)それらを隣接するフォルダーに移動しました。ただし、任意のパスに変更できます。

受け入れられた回答が機能しなかった理由がわかりません。また、ファイル名にスペースと特殊文字がありませんでした-多分これは動作しません。

ここで盗まれた: テキスト文字列を含むファイルを見つけて移動するためのGrepコマンド

5
vladkras

これは私がFedora Core 12で使用しているものです:

grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
5
Brad Vokey
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>

あなたが書いたgrepがあなたが期待しているファイルパスを返すと仮定します。

2
Loukan ElKadi

たぶんこれは動作します:

mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
2
Ritz

いくつかの方法がありますが、ここでは時間がかかりますがフェールセーフです。

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
1
e-satis

私にぴったりの仕事:

  • word MYSTRINGTOSEARCHでテキストを含むファイルをディレクトリMYDIRに移動します。

    見つける。 -type f -exec grep -il 'MYSTRINGTOSEARCH' {} \; -exec mv {} MYDIR/\;

これが役立つことを願っています

0
Mike