Qual é a maneira mais rápida e pragmática de combinar todos os arquivos * .txt em um diretório em um arquivo de texto grande?
Atualmente, estou usando o windows com cygwin para ter acesso ao BASH.
O comando shell do Windows também seria bom, mas duvido que exista um.
echo *.txt | xargs cat > all.txt
Lembre-se, para todas as soluções fornecidas até agora, o shell decide a ordem em que os arquivos são concatenados. Para Bash, IIRC, essa é a ordem alfabética. Se a ordem for importante, você deve nomear os arquivos adequadamente (01file.txt, 02file.txt, etc ...) ou especificar cada arquivo na ordem em que deseja concatenar.
fonte
O comando do shell do Windows
type
pode fazer isso:O
type
comando Type também grava nomes de arquivos no stderr, que não são capturados pelo>
operador de redirecionamento (mas serão exibidos no console).fonte
Você pode usar o shell do Windows
copy
para concatenar arquivos.Da ajuda:
fonte
Tenha cuidado, porque nenhum desses métodos funciona com um grande número de arquivos. Pessoalmente, usei esta linha:
EDIT: Como alguém disse nos comentários, você pode substituir
$(ls | grep ".txt")
por$(ls *.txt)
EDIT: graças à experiência @gnourf_gnourf, o uso de glob é a maneira correta de iterar arquivos em um diretório. Consequentemente, expressões blasfemas como
$(ls | grep ".txt")
devem ser substituídas por*.txt
(veja o artigo aqui ).Boa solução
fonte
for i in $(ls *.txt);do cat $i >> output.txt;done
?ls | grep
negativo , porque é um antipadrão muito ruim).ls *.txt
falha não ocorreria se houver muitos arquivos (erro da lista de argumentos muito longo)?a maneira mais pragmática com o shell é o comando cat. outras maneiras incluem,
fonte
cat
método acima concatenará a última e a primeira linha dos arquivos adjacentes.Que tal essa abordagem?
fonte
-maxdepth 1
ofind
comando.sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)
Por exemplo:
Isso pegará todos os arquivos txt na pasta C: \ e salvará na pasta C: \ 1 com o nome de all.txt
Ou
Por exemplo:
Isso pega todos os arquivos presentes na pasta e coloca lá Conteúdo em C: \ 1 \ all.txt
fonte
Você pode fazer assim:
cat [directory_path]/**/*.[h,m] > test.txt
se você
{}
incluir a extensão dos arquivos que deseja encontrar, há um problema de sequência.fonte
Quando você se deparar com um problema em que ele coloca all.txt em all.txt, tente verificar se all.txt existe ou não, se existir, remova
Como isso:
[ -e $"all.txt" ] && rm $"all.txt"
fonte
cat *.txt > all.txt
>
substituições de comando all.txt se existir>>
adiciona dados ao arquivo existentetudo isso é desagradável ....
coisas fáceis.
fonte
find . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;