views:

2549

answers:

5

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?

A: 

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

Check man xargs for more info.

Confusion
A: 

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
e-satis
+17  A: 
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 delimeters.

Then

-I{} mv {} DIR

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

daveb
Thanks, the capital -I should me lowercase on my xargs
In my xargs, -i is deprecated. But sandrv may have an older version (thus, YMMV).
gbarry
A: 

This alternative works where xargs is not availabe:

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

This is what I use in Fedora Core 12:

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