GNU/Linux >> Linux Esercitazione >  >> Linux

Grep Word all'interno di un file, quindi copia il file?

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:

  1. 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 GNU grep .)

    • --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 da grep sotto GNU/Linux, MacOS e FreeBSD ma non ApriBSD.)

    • LINUX/UNIX dice a grep di cercare solo i file il cui contenuto include la regex LINUX/UNIX

    • . cercare nella directory corrente. Puoi ometterlo nelle versioni recenti di GNU grep , ma poi dovresti passare un -- terminatore di opzione su cp per evitare nomi di file che iniziano con - .

  2. 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 con xargs di OSX .)

    • cp -t /path/to/dest copia le directory nella directory di destinazione. (-t richiede GNU cp .)


Linux
  1. Copia i file nel terminale Linux

  2. Sposta i file nel terminale Linux

  3. Estrarre file all'interno di un file exe?

  4. I migliori strumenti di trasferimento file su Linux

  5. Come usare il comando Rsync in Linux?

Come copiare file e directory in Linux

Comando Cp in Linux (copia file)

I 6 modi migliori per visualizzare i file in Linux

Come copiare file con estensione di file specifica in modo ricorsivo

Come copiare file e directory nel terminale Linux

Copia i file in modo sicuro con il comando SCP