Como concatenar arquivos de diferentes subdiretórios?

Como concatenar arquivos de diferentes subdiretórios?

Eu tenho uma pasta grande contendo muitos subdiretórios, cada um contendo muitos .txtarquivos. Quero concatenar todos esses arquivos em um único .txtarquivo. 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

fencontre todos os arquivos '*.txt' /path/to/sourcerecursivamente 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 globstarrecurso:

$ shopt -s globstar
$ cat **/*.txt > merged.txt

Uma abordagem mais geral, embora menos elegante, será usar findcomo driver e fazê-lo chamar catcada 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 findtente 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 findcomando

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 dotglobpara adicioná-los novamente).

informação relacionada