Você não precisa fazer loop, você pode dizer a cat
para ler todos os arquivos:
cat /var/abc/*.csv > file1.csv && rm /var/abc/*.csv
contanto que não haja muitos arquivos (mas o limite é enorme).
Usar &&
entre os dois comandos garante que os arquivos sejam excluídos apenas se forem "copiados" com êxito.
Existem algumas ressalvas:
- você não deve executar isso na mesma pasta que os arquivos originais que está concatenando, caso contrário, o
rm
excluirá o agregado e você perderá tudo; - se novos arquivos CSV aparecerem entre o início dos argumentos
cat
e a expansão derm
, eles serão excluídos sem serem copiados.
Para concatenar arquivos 1000 por vez (assim, um CSV resultante por 1000 CSV original), com qualquer número de arquivos que você prosseguir da seguinte forma, no diretório de destino:
find /var/abc -maxdepth 1 -type f -name \*.csv | split -d -l 1000 - csvlists
for file in csvlists*; do cat $(cat $file) > concat${file##csvlists}.csv && rm $(cat $file); done
Isso localizará todos os arquivos em /var/abc
denominado *.csv
e os listará 1000 por vez em arquivos que começam com csvlists
( csvlists00
, csvlists01
...). Em seguida, o loop for
lê cada lista de arquivos e concatena os arquivos CSV listados em um arquivo denominado concat00.csv
etc. para corresponder à lista. Depois que cada conjunto de arquivos é copiado, os arquivos originais são excluídos.
Esta versão assume que os nomes dos arquivos CSV não contêm espaços, novas linhas e assim por diante.