Come usare il comando "cat" sull'output del comando "find"?


13

Voglio reindirizzare l'output del findcomando da catcomandare in modo da poter stampare i dati del file specificato.

Quindi, per esempio, se l'output di find è /aFile/readmeallora il gatto dovrebbe essere interpretato come cat ./aFile/readme. Come posso farlo all'istante?

Devo usare le pipe?

Ho provato le versioni di questo:

cat | find ./inhere -size 1033c 2> /dev/null

Ma immagino che sia completamente sbagliato? Ovviamente sono sicuro che l'output è solo un file e non più file.

Quindi come posso farlo? Ho cercato su Google e non sono riuscito a trovare una soluzione, probabilmente perché non ho cercato bene: P

Risposte:


21

Puoi farlo da findsolo usando l' -execazione:

find /location -size 1033c -exec cat {} +

{}verrà espanso nei file trovati e +ci consentirà di leggere quanti più argomenti possibili per invocazione cat, poiché cat può accettare più argomenti.

Se il tuo findnon ha l' +estensione o vuoi leggere i file uno per uno:

find /location -size 1033c -exec cat {} \;

Se si desidera utilizzare qualsiasi opzione di cat, eseguire:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Qui sto usando l' -nopzione per ottenere i numeri di riga.


Quindi, se ho ragione: {} è come una variabile in cui è memorizzato l'output del comando find e dopo il segno "+" dovresti scrivere i parametri cat? No ? Modifica: Bene, hai modificato il tuo post e ora hai appena risposto alla mia domanda: P Grazie amico! Risolto!
Eksapsy,

@ general656 Controlla le mie modifiche ..
heemayl,

1
Il fatto che io non conoscevo cat's -nopzione mi sorprende. Adoro leggere domande casuali.
mazunki,

0

Sostituzione comando

Un'altra opzione è utilizzare la sostituzione dei comandi . L'avvolgimento di un comando $()eseguirà il comando e sostituirà il comando con il suo output.

cat $(find ./inhere -size 1033c 2> /dev/null)

diventerà

cat ./inhere/file1 .inhere/file3

Questo è più o meno equivalente all'utilizzo del vecchio stile di comandi di wrapping con tick posteriori:

cat `find ./inhere -size 1033c 2> /dev/null`

Maggiori dettagli dai documenti collegati sopra

Bash esegue l'espansione eseguendo il comando in un ambiente subshell e sostituendo la sostituzione del comando con l'output standard del comando, eliminando eventuali newline finali. Le nuove righe incorporate non vengono eliminate, ma possono essere rimosse durante la divisione delle parole. La sostituzione del comando $(cat file)può essere sostituita dall'equivalente ma più veloce $(< file).

Quando si utilizza il modulo di backquote vecchio stile di sostituzione, backslash conserva il suo significato letterale tranne quando seguito da $, `o \. Il primo backquote non preceduto da una barra rovesciata termina la sostituzione del comando. Quando si utilizza il $(command)modulo, tutti i caratteri tra parentesi formano il comando; nessuno è trattato in modo speciale.

Le sostituzioni di comandi possono essere nidificate. Per nidificare quando si utilizza il modulo con virgolette, sfuggire ai backquotes interni con barre rovesciate.

Se la sostituzione appare tra virgolette, la divisione delle parole e l'espansione del nome del file non vengono eseguite sui risultati.

Vedi questa altra risposta per alcuni buoni esempi di utilizzo.


Si noti che se findtrova troppi file, ciò genererebbe un errore "Elenco argomenti troppo lungo" che tenta di richiamare cat. Avrebbe anche problemi a gestire nomi di file contenenti caratteri di spazi bianchi e possibilmente anche nomi di file contenenti caratteri globbing di nome file.
Kusalananda

-1

Questo stamperà il nome e il contenuto dei file di testo (ascii) solo ricorsivamente.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Un altro tentativo

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

-2

Usa pipe e xargs

find /* -name pg_hba.conf | xargs cat

Se fallisce a causa della mancanza di permessi, puoi usare sudo per assicurarti di avere i permessi per eseguire il comando find sulla directory che stai cercando.

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
E se qualcuno ha creato un file chiamato /tmp/ /dev/urandom /pg_hba.conf, ciò consentirà a root di scaricare l'intero contenuto di /dev/urandom. Peggio probabilmente può essere fatto a seconda del contesto. xargsnon dovrebbe quasi mai essere usato senza del -0tutto. Inoltre sudo xargssarebbe meglio di xargs sudo. E /*sarebbe meglio come /.
Stéphane Chazelas il

1
L'OP vuole usare cat per stampare il contenuto del file su stdout. Quindi lo scopo è servito dal gatto. La domanda è come usare cat dal comando out put of find per stampare il contenuto del file e non come usare sudo o find. Il comando sopra risolve la domanda. Sì, xargs -0 è stata l'unica cosa costruttiva che hai indicato. Ma non ha mostrato l'utilizzo. Cerca di non essere scortese.
App lavoro il

Scusami se è sembrato maleducato. Non era questa l'intenzione. Volevo sottolineare i limiti. La tua risposta mostra cattive pratiche ( find|xargssenza -0dovrebbe essere davvero vietata), quindi il voto negativo . L'output di findwithout -print0non è affidabile dopo l'elaborazione. -print0non è standard. Detto questo, lo standard sudo find / -name pg_hba.conf -exec cat {} +potrebbe anche farti scaricare il contenuto di /dev/urandom(ad esempio se qualcuno ha creato un link simbolico da /tmp/pg_hba.confesso e non esiste un modo semplice per aggirare ciò che almeno non ha una condizione di competizione).
Stéphane Chazelas,

1
Non usiamo sudo"per ogni evenienza", vero?
Lindhe,

Bene, è meglio che correresudo rm -rf /
devinbost
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.