Question

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?

Was it helpful?

Solution

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.

Then

-I{} mv {} DIR

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

OTHER TIPS

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

Maybe this will work:

mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>

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

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

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

You can pass the result to the next command by using grep ... | xargs mv {} destination

Check man xargs for more info.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top