Use grep to find content in files and move them if they match

This is what I use in Fedora Core 12:

grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR

If you want to find and move files that do not match your pattern (move files that don't contain 'Subject \[SPAM\]' in this example) use:

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

The -Z means output with zeros (\0) after the filenames (so spaces are not used as delimeters).

xargs -0

means interpret \0 to be delimiters.

The -L means find files that do not match the pattern. Replace -L with -l if you want to move files that match your pattern.

Then

-I{} mv {} DIR

means replace {} with the filenames, so you get mv filenames DIR.


This is what helped me:

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

Of course, I was already in required folder (that's why ./) and moved them to neighboring folder. But you can change them to any paths.

I don't know why accepted answer didn't work. Also I didn't have spaces and special characters in filenames - maybe this will not work.

Stolen here: Grep command to find files containing text string and move them


This alternative works where xargs is not availabe:

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