Concat 1000 arquivos dentro de um diretório [closed]

0

Eu sei que podemos concatir arquivos por cat file [file] [[file] ...] > joined-file . Eu tenho diretório que contém muitos arquivos. Eu quero concatir todos eles. Eu quero concatir 1000 arquivos, independentemente do seu nome e ordem. Isso que eu tentei

for i in /var/abc/*.csv; do "$i" > file1.csv ; rm -rf "$i";done

mas para acompanhar a contagem de outra variável. O que pode ser um método eficiente? Então eu não posso concatenar diretamente 1000 arquivos e movê-los.

Editar Por que 1000 porque o diretório contém milhares de arquivos. O tamanho do arquivo é importante. Eu tentei isso com suas respostas.

cd /var/abc 
for file in $(ls -p | grep -v / | tail -1000);do cat "$file" >>"/var/abcd/xigzag"$tick".csv" && rm -rf "$file";done
    
por Aashu 23.05.2015 / 09:33

3 respostas

5

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 de rm , 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.

    
por 23.05.2015 / 09:44
1

Seu comando parece quase perfeito. Basta adicionar um cat e >> para adicionar o conteúdo:

for i in /var/abc/*.csv; do cat "$i" >> file1.csv && rm -rf "$i";done

Eu não entendo muito bem a parte da contagem. Você poderia fazer algo assim:

let count=0
for i in /var/abc/*.csv; do
  cat "$i" >> file1.csv && rm -rf "$i"
  let count++
done
echo $count files processed.
    
por 23.05.2015 / 10:16
0

com zsh :

files=(/var/abc/*.csv(N.))
n=0
while (($#files)) {
  cat $files[1,1000] > file$((++n)).csv &&
    rm -f $files[1,1000] || break
  files[1,1000]=()
}
    
por 23.05.2015 / 10:56