Use grep to find content in files and move them if they match
LinuxShellScriptingGrepLinux Problem Overview
I'm using grep to generate a list of files I need to move:
grep -L -r 'Subject: \[SPAM\]' .
How can I pass this list to the mv command and move the files somewhere else?
Linux Solutions
Solution 1 - Linux
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
.
Solution 2 - Linux
This alternative works where xargs is not availabe:
grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done
Solution 3 - Linux
This is what I use in Fedora Core 12:
grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
Solution 4 - Linux
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
Solution 5 - Linux
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>
Assuming that the grep you wrote returns the files paths you're expecting.
Solution 6 - Linux
Maybe this will work:
mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
Solution 7 - Linux
There are several ways but here is a slow but failsafe one :
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
Solution 8 - Linux
Work perfect fo me :
-
move files who contain the text withe the word MYSTRINGTOSEARCH to directory MYDIR.
find . -type f -exec grep -il 'MYSTRINGTOSEARCH' {} ; -exec mv {} MYDIR/ ;
I hope this helps
Solution 9 - Linux
You can pass the result to the next command by using grep ... | xargs mv {} destination
Check man xargs for more info.