Como concatenar arquivos de diferentes subdiretórios?

0

Eu tenho uma pasta grande contendo muitos subdiretórios, cada um contendo muitos arquivos .txt . Eu quero concatenar todos esses arquivos em um arquivo .txt . Eu posso fazer isso para cada um dos subdiretórios com cat *.txt>merged.txt , mas estou tentando fazer isso para todos os arquivos na pasta grande. Como faço isso?

    
por swagmasterj 04.06.2018 / 05:42

3 respostas

1

tente com

find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile

encontre todos os '* .txt' f iles em /path/to/source recursivamente para subdiretórios e concatene todos em um mergedfile .

Para concatenar os arquivos de subdiretórios em seu diretório, faça:

find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;
    
por 04.06.2018 / 05:48
0

Se você estiver usando o Bash e o número de arquivos de texto estiver contido (ou seja, não exceder o limite máximo do número de argumentos, que é muito grande, mas não infinito), você pode facilmente fazer isso com o recurso globstar :

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

Uma abordagem mais geral, embora menos elegante, será usar find como o driver e chamar cat em cada arquivo, anexando a saída:

$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;

Chamar sh é necessário aqui porque você deseja anexar o resultado de cada 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 pode tentar concatenar a saída consigo mesmo.

    
por 04.06.2018 / 06:31
0

Se você tiver que fazer a concatenação em uma ordem específica, então a seguir concatenaremos 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 comando find

find  . -type f -name '*.txt' -exec cat {} ';' >merged.out

exceto que a ordenação pode ser diferente, links simbólicos para arquivos regulares seriam incluídos (adicione um && [ ! -L "$name" ] se você não quiser) e arquivos ocultos (e arquivos em diretórios ocultos) seriam excluídos (use shopt -s dotglob para adicioná-los de volta).

    
por 04.06.2018 / 07:50

Tags