Mostrar o conteúdo de muitos arquivos

19

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

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

Agora eu 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.

[...]

Eu 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!

Znarkus
fonte

Respostas:

30

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

Aqui, parece que você deseja ver todos os arquivos, exceto o único cujo nome começa com um ponto. Os arquivos de ponto são "ocultos" no unix: eles não aparecem na saída padrão lsou em uma correspondência 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 caso um dos nomes de arquivo comece com a -.)

Gilles 'SO- parar de ser mau'
fonte
Curto e doce, obrigado! Você sabe onde eu posso ler sobre o --modificador?
Znarkus
2
@ Znarkus: --significar o fim das opções é uma convenção que a maioria dos comandos obedece. Por exemplo, tail -n +1 -- -f -gdiz tailque -fe -gsão arquivos para ler (operandos) e não opções. É a diretriz 10 na diretriz de sintaxe do utilitário POSIX (um documento destinado a escritores de utilitários). Não tenho uma sugestão de leitura destinada a usuários finais, espero que um bom tutorial do unix cubra-a em algum momento.
Gilles 'SO- stop be evil'
Apenas uma observação, porque muitas outras respostas propor a utilização find, mas, em seguida, usar algum exec com impressão formatação: Uma maneira simples de usar finde tailé: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0e xargs -0ea --garantir que o comando também funciona com nomes de arquivos com espaços ou começando com -)
IanH
14

Você pode fazer tudo em um com find:

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

Isso indica findpara encontrar todos os arquivos ( -type f) no diretório atual ( .), exceto ( -not) um chamado .htaccess( -name .htaccess). Em seguida, imprime ( -printf) uma nova linha seguida pelo nome do arquivo ( %p) e depois executa catno arquivo ( -exec cat {} \;). Isso lhe dará uma 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, pode valer a pena colá-lo em um shell script ou em uma função; Eu tenho um nome catsque faz exatamente isso:

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

Ele faz um loop sobre cada argumento do nome do arquivo, imprime o nome do arquivo (em verde negrito) e depois cria o arquivo:

Captura de tela de exemplo

Então o comando seria apenas:

$ find . -type f -not -name .htaccess -exec cats {} \+
Michael Mrozek
fonte
O outro era mais baixo, então aceitou isso. Excelente resposta, obrigado!
Znarkus
6

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

grep -vI "\x00" -- *

e similar, mas recursivamente:

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 impede a exibição de arquivos binários (o que -Irealmente está ocorrendo, mas ainda precisamos usar algum padrão).
  • Usando curinga ( *), ele ignora automaticamente arquivos ocultos, como .htaccess.

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

kenorb
fonte
2
Geralmente grep -r ^é o suficiente.
catpnosis
2

Você pode usar isto:

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

Se você deseja ajustar e não perder muito tempo com tubos, encontre e tudo (embora seja a cadeia de ferramentas mais poderosa que você já tenha encontrado)

tente usar um loop for, cat, etc.

tiktak
fonte
0

Se você também quiser imprimir, use recursivamente (para arquivos com extensão .sql, por exemplo):

find -name "*.sql" -exec cat {} \; > all.sql
Andrade
fonte