Mostra o conteúdo de muitos arquivos

15

Na linha de comando, qual é a maneira mais fácil de mostrar o conteúdo de vários arquivos? Meu diretório se parece com o abaixo.

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

Agora, gostaria de ver o conteúdo de todos os arquivos, exceto .htaccess . Pode parecer algo como:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Acho que isso deve ser possível com uma combinação de find, xargs e cat, mas ainda não descobri como. Obrigado pelo seu tempo!

    
por Znarkus 30.04.2011 / 00:30

6 respostas

22

Os dois comandos padrão head e tail imprimem um cabeçalho com o nome do arquivo se você passar mais de um argumento de arquivo. Para imprimir o arquivo inteiro, use tail -n +1 (imprimir a partir da primeira linha, ou seja, tudo).

Aqui, parece que você quer ver todos os arquivos, exceto o único, cujo nome começa com um ponto. Os arquivos Dot estão “ocultos” no unix: eles não aparecem na saída padrão de ls ou em uma correspondência de curinga. Portanto, a correspondência de todos os arquivos não ocultos é feita com apenas * .

tail -n +1 *

(Estritamente falando, tail -n +1 -- * é necessário no caso de um dos nomes dos arquivos começar com - .)

    
por 30.04.2011 / 01:02
10

Você pode fazer tudo em um com find :

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

Isso indica a find para localizar todos os arquivos ( -type f ) no diretório atual ( . ), exceto ( -not ) um chamado .htaccess ( -name .htaccess ). Em seguida, ele imprime ( -printf ) uma nova linha seguida do nome do arquivo ( %p ) e, em seguida, executa cat no arquivo ( -exec cat {} \; ). Isso lhe dará saída como:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Se você fizer isso com frequência, talvez valha a pena colocá-lo em um shell script ou em uma função; Eu tenho um chamado cats que faz exatamente isso:

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

Faz um loop sobre cada argumento de nome de arquivo, imprime o nome do arquivo (em negrito verde) e, em seguida, captura o arquivo:

Então, o comando seria apenas:

$ find . -type f -not -name .htaccess -exec cats {} \+
    
por 30.04.2011 / 00:46
6

Para mostrar o conteúdo de todos os arquivos na pasta atual, tente:

grep -vI "\x00" -- *

e semelhante, mas de forma recursiva:

grep -vIr "\x00" -- .

O formato seria: filename: content .

Para ter um formato semelhante ao sugerido, seria:

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

Notas laterais:

  • O uso de NUL ( \x00 ) nos exemplos acima evita a exibição de arquivos binários (o que -I está realmente fazendo, mas ainda precisamos usar algum padrão).
  • Usando curinga ( * ), ele ignora automaticamente os arquivos ocultos, como .htaccess .

Veja também: grep: exibe o nome do arquivo uma vez e exibe o contexto com números de linha no Unix SE

    
por 09.05.2015 / 01:04
2

Você pode usar isto:

cat $(find Directory/ -not -name *.htaccess)
    
por 25.01.2015 / 06:04
1

Se você quiser afinar e não perder muito tempo com canos, encontre e tudo (embora seja a ferramenta mais poderosa que você poderia encontrar)

apenas tente usar um loop, gato, etc.

    
por 30.04.2011 / 12:29
0

Se você quiser também imprimi-lo de forma recursiva (para arquivos com extensão .sql, por exemplo):

find -name "*.sql" -exec cat {} \; > all.sql
    
por 07.12.2017 / 20:29