Mostra i contenuti di molti file


19

Dalla riga di comando, qual è il modo più semplice per mostrare il contenuto di più file? La mia directory appare come di seguito.

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

Ora vorrei visualizzare il contenuto di tutti i file tranne .htaccess. Potrebbe assomigliare a:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Penso che questo dovrebbe essere fattibile con una combinazione di find, xargs e cat, ma non ho capito come. Grazie per il tuo tempo!


Risposte:


30

I due comandi standard heade tailstampano un'intestazione con il nome del file se li si passa più di un argomento di file. Per stampare l'intero file, utilizzare tail -n +1(stampa dalla prima riga in poi, ovvero tutto).

Qui, sembra che tu voglia vedere tutti i file tranne quello singolo il cui nome inizia con un punto. I file Dot sono "nascosti" sotto unix: non compaiono nell'output predefinito di lso in una corrispondenza jolly. Quindi la corrispondenza di tutti i file non nascosti viene eseguita solo con *.

tail -n +1 *

(A rigor di termini, tail -n +1 -- *è necessario nel caso in cui uno dei nomi dei file inizi con un -.)


Breve e dolce grazie! Sai dove posso leggere sul --modificatore?
Znarkus,

2
@Znarkus: --indicare la fine delle opzioni è una convenzione alla quale la maggior parte dei comandi obbedisce. Ad esempio tail -n +1 -- -f -gdice tailche -fe -gsono file da leggere (operandi) e non opzioni. È la linea guida 10 nella linea guida della sintassi dell'utilità POSIX (un documento destinato agli autori di utilità). Non ho un suggerimento di lettura destinato agli utenti finali, mi aspetto un buon tutorial su Unix per coprirlo ad un certo punto.
Gilles 'SO- smetti di essere malvagio' il

Solo un commento, perché molte altre risposte propongono di utilizzo find, ma poi utilizzare alcuni exec con la formattazione di stampa: Un modo semplice da usare finded tailè: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0ed xargs -0e --assicurano che il comando funziona anche con i nomi di file con spazi o iniziare con -)
IanH

14

Puoi fare tutto in uno con find:

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

Questo dice finddi trovare tutti i file ( -type f) nella directory corrente ( .) tranne ( -not) uno chiamato .htaccess( -name .htaccess). Quindi stampa ( -printf) una nuova riga seguita dal nome file ( %p), quindi viene eseguita catsul file ( -exec cat {} \;). Questo ti darà un output come:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Se lo fai spesso potrebbe valere la pena incollarlo in uno script di shell o in una funzione; Ne ho uno catsche fa esattamente questo:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

Passa sopra ogni argomento del file, stampa il nome del file (in grassetto verde) e quindi gatta il file:

Schermata di esempio

Quindi il comando sarebbe solo:

$ find . -type f -not -name .htaccess -exec cats {} \+

L'altro era più corto, così accettato. Ottima risposta però, grazie!
Znarkus,

6

Per mostrare il contenuto di tutti i file nella cartella corrente, prova:

grep -vI "\x00" -- *

e simili, ma ricorsivamente:

grep -vIr "\x00" -- .

Il formato potrebbe essere: filename: content.

Per avere un formato simile a quello suggerito, sarebbe:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

Note a margine:

  • L'uso di NUL ( \x00) negli esempi precedenti impedisce la visualizzazione di file binari (cosa che -Ista effettivamente facendo, ma dobbiamo comunque usare alcuni pattern).
  • Usando il carattere jolly ( *), ignora automaticamente i file nascosti come .htaccess.

Vedi anche: grep: visualizza il nome file una volta, quindi visualizza il contesto con i numeri di riga su Unix SE


2
Di solito grep -r ^è abbastanza.
catpnosi,

2

Puoi usare questo:

cat $(find Directory/ -not -name *.htaccess)

1

Se vuoi mettere a punto e non perdere troppo tempo con le pipe, trova e tutto (anche se è la più potente toolchain che potresti mai trovare)

prova a usare un for-loop, un gatto, ecc.


0

Se anche tu vuoi stamparlo, lo usi in modo ricorsivo (ad esempio per i file con estensione .sql):

find -name "*.sql" -exec cat {} \; > all.sql
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.