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

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 alternative works where xargs is not availabe:

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

This is what I use in Fedora Core 12:

grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' 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


mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>

Assuming that the grep you wrote returns the files paths you're expecting.