Distribuindo milhares de arquivos em subpastas

3

Eu tenho uma pasta A com centenas de milhares de arquivos. Gostaria de mover esses arquivos para novas subpastas S_i , com, digamos, 100 arquivos em cada (a última pasta pode ter menos de 100 arquivos)

Em outras palavras, se minha pasta A tiver:

file1
file2
...
file1000

Eu teria mais tarde:

S_1:    
    file_1
    ...
    file_100    
S_2:
    file_101
    ...
    file_200
...

Antes de escrever um script Zsh manualmente para fazer essa tarefa (por exemplo, usando variáveis para contar arquivos), fiquei me perguntando se há ferramentas prontamente disponíveis (como split ) que facilitaria essa tarefa.

    
por Amelio Vazquez-Reina 31.01.2013 / 19:35

2 respostas

4

com zsh :

autoload zmv
zmv 'file_(<->)' 'S_$((1 + ($1 - 1) / 100))'

Se os arquivos não estiverem numerados, mas você quiser apenas dividir essa lista:

n=0; zmv -Q 'file_*(n)' 'S_$((n++/100+1))'

(n) é alternar a ordem numérica para a lista (e você precisa de -Q para esse qualificador de globbing).

Aqueles chamam um mv por arquivo. Você pode torná-lo um pouco mais eficiente fazendo mv builtin ( zmodload zsh/files ), ou você poderia fazer:

files=(file_*(nN))
for ((n=1; $#files; n++)) {
  mv -- $files[1,100] S_$n
  files[1,100]=()
}

Os (nN) acima são zsh qualificadores que qualificam ainda mais o glob. n é para a classificação numérica , N é para ativar a opção nullglob para esse glob, ou seja, para o glob expandir para uma lista vazia quando não há correspondência.

(com esse, você poderia até jogar um mkdir S_$n caso esses diretórios não existissem de antemão).

    
por 31.01.2013 / 21:12
4

Se os nomes dos arquivos não contiverem espaços:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n100)

Usando parallel :

ls|parallel -n100 mkdir {#}\;mv {} {#}
    
por 28.04.2014 / 13:52