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:
-
grepopzioni e argomenti-
-rdice a grep di cercare ricorsivamente attraverso la struttura della directory. (Su FreeBSD,-rseguirà 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.txto.txt). -
-ldice a grep di restituire solo i nomi dei file corrispondenti, non la corrispondenza stessa. -
--nulldice a grep di usare i caratteri NUL per separare i nomi dei file. (--nullè supportato dagrepsotto GNU/Linux, MacOS e FreeBSD ma non ApriBSD.) -
LINUX/UNIXdice 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 sucpper evitare nomi di file che iniziano con-.
-
-
xargsopzioni e argomenti-
-0dice a xargs di aspettarsi un input separato da NUL. -
-rdice 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 conxargsdi OSX .) -
cp -t /path/to/destcopia le directory nella directory di destinazione. (-trichiede GNUcp.)
-