Ho una raccolta di file ( *.zip, *.txt, *.tar.gz, *.doc, ...ecc ). Questi file risiedono all'interno di un percorso. Voglio trovare tutti i file ( *.txt), quindi copiare solo i file di testo che contengono parole specifiche (es. LINUX/UNIX).
Ho eseguito quanto segue:
find . -name "*.txt" | grep 'LINUX/UNIX'
Questo comando è stato in grado di trovare tutti i file di testo, quindi "grep" ha filtrato i file di testo risultanti elencando solo i file di testo che contengono "LINUX/UNIX".
Come posso copiare questi file finali (ovvero i file di testo che contengono "LINUX/UNIX") in un percorso specifico a scelta?
Ho provato ad applicare xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Ma non ha funzionato
Risposta accettata:
Prova:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest
Poiché questo comando utilizza la separazione NUL, è sicuro per tutti i nomi di file, inclusi quelli con nomi difficili che includono spazi vuoti, tabulazioni o persino newline.
Quanto sopra richiede GNU cp
. Per MacOS/FreeBSD, prova:
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh
Come funziona:
-
grep
opzioni e argomenti-
-r
dice a grep di cercare ricorsivamente attraverso la struttura della directory. (Su FreeBSD,-r
seguirà i collegamenti simbolici nelle directory. Questo non è vero né per OS/X né per le versioni recenti di GNUgrep
.) -
--include '*.txt'
dice a grep di restituire solo i file i cui nomi corrispondono al glob*.txt
(compresi quelli nascosti come.foo.txt
o.txt
). -
-l
dice a grep di restituire solo i nomi dei file corrispondenti, non la corrispondenza stessa. -
--null
dice a grep di usare i caratteri NUL per separare i nomi dei file. (--null
è supportato dagrep
sotto GNU/Linux, MacOS e FreeBSD ma non ApriBSD.) -
LINUX/UNIX
dice a grep di cercare solo i file il cui contenuto include la regexLINUX/UNIX
-
.
cercare nella directory corrente. Puoi ometterlo nelle versioni recenti di GNUgrep
, ma poi dovresti passare un--
terminatore di opzione sucp
per evitare nomi di file che iniziano con-
.
-
-
xargs
opzioni e argomenti-
-0
dice a xargs di aspettarsi un input separato da NUL. -
-r
dice a xargs di non eseguire il comando a meno che non sia stato trovato almeno un file. (Questa opzione non è necessaria né su BSD né su OSX e non è compatibile conxargs
di OSX .) -
cp -t /path/to/dest
copia le directory nella directory di destinazione. (-t
richiede GNUcp
.)
-