L'uso di grep per trovare il contenuto di file e spostarli se corrispondono
Domanda
Sto usando grep per generare un elenco di file che ho bisogno di spostare:
grep -L -r 'Subject: \[SPAM\]' .
Come faccio a passare questo elenco per il comando mv e spostare i file da qualche altra parte?
Soluzione
grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR
La -Z uscita con zeri (\0) dopo i nomi dei file (in modo che gli spazi non sono utilizzati come delimitatori).
xargs -0
significa interpretare \ " 0 " per essere delimitatori.
Quindi
-I{} mv {} DIR
significa sostituire {}
con i nomi dei file, in modo che si ottiene mv filenames DIR
.
Altri suggerimenti
Questa alternativa in cui lavora xargs non è availabe:
grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done
Questo è quello che io uso Fedora Core 12:
grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR
Questo è quello che mi ha aiutato:
grep -lir 'spam' ./ | xargs mv -t ../spam
Naturalmente, ero già in cartella (che è il motivo ./
) e ha mosso i loro vicini cartella.Ma si può cambiare a tutti i percorsi.
Non so perché ha accettato di rispondere non ha funzionato.Anche io non ho spazi e caratteri speciali nei nomi di file - forse questo non funzionerà.
Rubato qui: Comando Grep per trovare i file che contengono la stringa di testo e spostarli
Forse questo lavoro:
mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print $1}') your_file
mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>
Supponendo che il grep hai scritto restituisce il file di percorsi ci si aspetta.
Ci sono diversi modi, ma qui è un lento, ma failsafe uno :
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
Lavoro perfetto, mi fo :
spostare i file che contengono il testo con la parola MYSTRINGTOSEARCH directory DIR.
trovare .-type f -exec grep -il 'MYSTRINGTOSEARCH' {} \;-exec mv {} MYDIR/ \;
Spero che questo aiuta
È possibile passare il risultato di un comando successivo utilizzando grep ...| xargs mv {} di destinazione
Controllare l'uomo xargs per ulteriori informazioni.