
Eu tenho uma pasta grande contendo muitos subdiretórios, cada um contendo muitos .txt
arquivos. Quero concatenar todos esses arquivos em um único .txt
arquivo. Consigo fazer isso para cada um dos subdiretórios com cat *.txt>merged.txt
, mas estou tentando fazer isso para todos os arquivos da pasta grande. Como eu faço isso?
Responder1
tente com
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
f
encontre todos os arquivos '*.txt' /path/to/source
recursivamente para subdiretórios e concatene tudo em um mergedfile
.
Para concatenar os arquivos de cada subdiretório em seu diretório, faça:
find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;
Responder2
Se você estiver usando Bash e o número de arquivos de texto estiver contido (ou seja, não excede o limite máximo de número de argumentos, que é muito grande, mas não infinito), você pode conseguir isso facilmente com o globstar
recurso:
$ shopt -s globstar
$ cat **/*.txt > merged.txt
Uma abordagem mais geral, embora menos elegante, será usar find
como driver e fazê-lo chamar cat
cada arquivo, anexando a saída:
$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;
A chamada sh
é necessária aqui porque você deseja anexar o resultado de cada um cat
. Certifique-se de que o arquivo de saída tenha uma extensão diferente ou esteja fora da árvore que você está mesclando, ou find
tente concatenar a saída consigo mesmo.
Responder3
Se você tiver que fazer a concatenação em uma ordem específica, o seguinte irá concatenar os arquivos em ordem lexicográfica (classificados por nomes de caminho) em bash
:
shopt -s globstar
for name in **/*.txt; do
[ -f "$name" ] && cat <"$name"
done >merged.out
Isso é semelhante ao find
comando
find . -type f -name '*.txt' -exec cat {} ';' >merged.out
exceto que a ordem pode ser diferente, links simbólicos para arquivos regulares seriam incluídos (adicione um && [ ! -L "$name" ]
se não os desejar) e arquivos ocultos (e arquivos em diretórios ocultos) seriam excluídos (use shopt -s dotglob
para adicioná-los novamente).