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 long
esse, porque quis usar em find
vez do cat
comando.
cat
.Respostas:
O
find
utilitário lida com nomes de caminho. Se nenhuma ação específica for mencionada nofind
comando 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-exec
aofind
comando: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,
cat
seria chamado para concatenar o conteúdo dos arquivos.A saída iria para
/home/fifa/cbs/test.txt
.Palavras-chave:
fonte
A saída de
find
resultará com os nomes de arquivo relevantes.Você pode canalizar (
|
) a saída naxargs cat
qual ocat
comando será executado em cada arquivo.por exemplo:
Outra opção será usar
-exec cat
fonte
-exec cat {} \;
e-exec -cat {} +
. A propósito, muito obrigado Yaron.find -print0 | xargs -0
não é vulnerável a espaços / aspas / etc.-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 quefind|xargs
seja 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 axargs
versão enquanto o cache do disco estava frio?