Como posso imprimir o conteúdo em vez do nome do arquivo usando o comando linux find?

10

Eu tenho milhares de arquivos não nomeados com algo assim cbs_cdr_vou_20180624_603_126_239457.unl. Eu queria imprimir todas as linhas desses arquivos usando o seguinte comando. mas está me dando apenas nomes de arquivos. Não preciso de nomes de arquivos, só preciso do conteúdo desses arquivos.

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

Saída atual:

./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

Saída esperada:

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|;

Observe que, para o comando cat, estou recebendo um erro como -bash: /bin/logger: Argument list too longesse, porque quis usar em findvez do catcomando.

Rezuan
fonte
Você ainda precisa usar cat.
Ignacio Vazquez-Abrams
Sim! Você pode me dizer como posso fazer isso? @ IgnacioVazquez-Abrams
Rezuan

Respostas:

28

O findutilitário lida com nomes de caminho. Se nenhuma ação específica for mencionada no findcomando para os nomes de caminho encontrados, a ação padrão é produzi-los.

Você pode executar uma ação nos nomes de caminho encontrados, como em execução cat, adicionando -execao findcomando:

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

Isso encontraria todos os arquivos regulares no diretório atual ou abaixo dele, cujos nomes correspondem ao padrão especificado. Para lotes tão grandes quanto possível, catseria chamado para concatenar o conteúdo dos arquivos.

A saída iria para /home/fifa/cbs/test.txt.

Palavras-chave:

Kusalananda
fonte
1
Trabalhar como esperado e o tempo de execução é muito rápido, o que é realmente ótimo. Muito Obrigado.
Rezuan
12

A saída de findresultará com os nomes de arquivo relevantes.
Você pode canalizar ( |) a saída na xargs catqual o catcomando será executado em cada arquivo.

por exemplo:

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

Outra opção será usar -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt
Yaron
fonte
4
Ambos os seus comandos estão funcionando bem. Mas um pouco mais lento que o comando de Kusalananda . Eu acho que o tempo de execução está aumentando -exec cat {} \;e -exec -cat {} +. A propósito, muito obrigado Yaron.
Rezuan 24/06
xargs é vulnerável a espaços nos nomes de caminho encontrados; -exec cat {} não é
jez 24/06
2
find -print0 | xargs -0não é vulnerável a espaços / aspas / etc.
fofo
1
@Rezuan: -exec cat {} \;executa o gato separadamente para cada arquivo, em vez de agrupá-los como xargs. Não o use, a menos que você queira explicitamente (por exemplo, um comando que funcione apenas para um arquivo de cada vez) ou se você precisar de portabilidade para um sistema sem -exec ... +e sem -print0/ xargs -0. Estou um pouco surpreso que find|xargsseja mensuradamente mais lento do -exec cat {} +que isso. Você tem muito poucos arquivos no total, então a sobrecarga de inicialização custa muito? Ou você apenas cronometrou a xargsversão enquanto o cache do disco estava frio?
Peter Cordes
1
@ PeterCordes obrigado pela explicação. Era para o cache do disco, percebi mais tarde.
Rezuan