Consegui o seguinte para funcionar no Mac OS X:
find . -type f -exec cat {} > ../results.txt \;
No entanto, não entendo completamente por que funciona, por isso seria útil se alguém pudesse explicar.
Digamos que eu tenha uma estrutura de diretórios com esta aparência:
file1.txt
folder1/
file2.txt
folder2/
file3.txt
Como posso concatenar file1.txt, file2.txt e file3.txt em um único arquivo?
Edit: esta estrutura de diretórios é apenas um exemplo. A questão é sobre como concatenar arquivos de subpastas, considerando qualquer estrutura de diretório e qualquer número de arquivos.
cat file1.txt folder1/file2.txt folder2/file3.txt > single.txt
De qual sistema operacional estamos falando?
Assumindo o Windows, use os seguintes comandos (substituindo file / foldernames conforme necessário):
C:\> ren > TARGET.TXT 2> nul
C:\> cd MyFolder
C:\MyFolder> for /R %i in (*) do copy /b \TARGET.TXT + "%i" \TARGET.TXT
A primeira linha cria (ou apaga) o arquivo C:\TARGET.TXT
usando comandos internos. O terceiro comando recursa em todos os arquivos no diretório atual e em seus subdiretórios e os anexa ao arquivo de destino (observe que ele não incluirá arquivos ocultos). Ele usa a opção /b
para copiá-los em formato binário, no caso de alguns arquivos não serem apenas texto simples.
copy /y file1.txt+folder1\file2.txt+folder2\file.txt destination.txt
deve fazer o truque
FYI, o /y
desativa a solicitação
Supondo que você queria todos os arquivos em todos os subdiretórios, ou que há algum identificador pesquisável distinto, acabei de fazer o seguinte funcionar. Observe que neste exemplo eu estava usando uma porta dos comandos unix find e cat portados para um sistema Windows. Eu não sei quantos anos essa porta do Windows em particular é tão quilometragem pode variar.
find . -type f -exec cat {} ; | cat > bigfile.txt
Ao usar o Ubuntu 10.10 e o shell bash, descobri que a sintaxe a seguir funcionava melhor, porque encontrar bigfile.txt "encontrado", se ele fosse criado no caminho de pesquisa e porque certas partes do comando precisavam ser escapadas. Observe que as diferenças entre essa porta e a porta do Windows são as aspas simples ao redor dos colchetes, uma barra invertida antes do ponto-e-vírgula e a criação do diretório de um diretório do container.
find . -type f -exec cat '{}' \; | cat > ../bigfile.txt