Come posso stampare il contenuto anziché il nome del file usando il comando find di linux?


10

Ho migliaia di file unl chiamati in questo modo cbs_cdr_vou_20180624_603_126_239457.unl. Volevo stampare tutte le righe da quei file usando il seguente comando. ma mi sta dando solo nomi di file. Non ho bisogno di nomi di file, ho solo bisogno di contenuti da quei file.

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

Uscita corrente:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

Uscita prevista:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

Si noti che, per il comando cat sto ricevendo un errore come -bash: /bin/logger: Argument list too longquello è il motivo per cui volevo usare findinvece del catcomando.


Hai ancora bisogno di usare cat.
Ignacio Vazquez-Abrams,

Sì! Puoi per favore dirmi come posso farlo? @ IgnacioVazquez-Abrams
Rezuan

Risposte:


28

L' findutilità si occupa dei percorsi. Se nel findcomando non viene menzionata alcuna azione specifica per i percorsi trovati, l'azione predefinita è di generarli.

È possibile eseguire un'azione sui nomi dei percorsi trovati, ad esempio in esecuzione cat, aggiungendo -execal findcomando:

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

Questo troverebbe tutti i file regolari all'interno o sotto la directory corrente, i cui nomi corrispondono al modello dato. Per il maggior numero possibile di questi, catverrebbero chiamati per concatenare il contenuto dei file.

L'output andrebbe a /home/fifa/cbs/test.txt.

Relazionato:


1
Lavorare come previsto e il tempo di esecuzione è molto veloce, il che è davvero fantastico. Grazie molto.
Rezuan,

12

L'output di findrisulterà con i nomi dei file pertinenti.
È possibile reindirizzare ( |) l'output al xargs catquale eseguirà il catcomando su ciascun file.

per esempio:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

Un'altra opzione sarà quella di utilizzare -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt

4
Entrambi i tuoi comandi funzionano bene. Ma un po 'più lento del comando di Kusalananda . Immagino che i tempi di esecuzione stiano cambiando -exec cat {} \;e -exec -cat {} +. A proposito, grazie mille Yaron.
Rezuan,

xargs è vulnerabile agli spazi nei nomi dei percorsi trovati; -exec cat {} non lo è
jez

2
find -print0 | xargs -0non è vulnerabile a spazi / virgolette / ecc.
soffice

1
@Rezuan: -exec cat {} \;esegue cat separatamente per ogni file invece di raggrupparli come xargs. Non utilizzarlo se non lo si desidera esplicitamente (ad es. Un comando che funziona solo per un file alla volta) o se è necessaria la portabilità su un sistema senza -exec ... +e senza -print0/ xargs -0. Sono un po 'sorpreso che find|xargssia misurabilmente più lento di -exec cat {} +, però. Hai pochissimi file totali, quindi l'overhead di avvio è molto costoso? O hai solo cronometrato la xargsversione mentre la cache del tuo disco era fredda?
Peter Cordes,

1
@PeterCordes grazie per la spiegazione. Era per la cache del disco, mi sono reso conto in seguito.
Rezuan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.