Questo è quello che uso in Fedora Core 12:
grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
 Se vuoi trovare e spostare i file che non corrispondono al tuo schema (sposta i file che non contengono 'Subject \[SPAM\]' in questo esempio) utilizzare:
grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR
-Z significa output con zeri (\0) dopo i nomi dei file (quindi gli spazi non sono usati come delimitatori).
xargs -0
significa interpretare \0 come delimitatori.
 Il -L significa trovare i file che non corrispondono al modello. Sostituisci -L con -l se vuoi spostare i file che corrispondono al tuo schema.
Poi
-I{} mv {} DIR
 significa sostituire {} con i nomi dei file, quindi ottieni mv filenames DIR .
Questo è ciò che mi ha aiutato:
 grep -lir 'spam' ./ | xargs mv -t ../spam 
 Ovviamente ero già nella cartella richiesta (ecco perché ./ ) e li ho spostati nella cartella adiacente. Ma puoi cambiarli in qualsiasi percorso.
Non so perché la risposta accettata non abbia funzionato. Inoltre non avevo spazi e caratteri speciali nei nomi dei file - forse questo non funzionerà.
Rubato qui:comando Grep per trovare file contenenti stringhe di testo e spostarli
Questa alternativa funziona dove xargs non è disponibile:
grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done