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

LinuxShellScriptingGrep

Linux 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser17582View Question on Stackoverflow
Solution 1 - LinuxdavebView Answer on Stackoverflow
Solution 2 - LinuxTobias KunzeView Answer on Stackoverflow
Solution 3 - LinuxBrad VokeyView Answer on Stackoverflow
Solution 4 - LinuxvladkrasView Answer on Stackoverflow
Solution 5 - LinuxLoukan ElKadiView Answer on Stackoverflow
Solution 6 - LinuxRitzView Answer on Stackoverflow
Solution 7 - Linuxe-satisView Answer on Stackoverflow
Solution 8 - LinuxMike Castro DemariaView Answer on Stackoverflow
Solution 9 - LinuxConfusionView Answer on Stackoverflow