Mover um intervalo de arquivos numerados?

9

Eu tenho 291 arquivos numerados (começando em 001 - título e terminando em 291 - título) que precisam ser movidos para diretórios separados. (De 001 a 021 para a pasta 1, de 022 a 053 para a pasta 2, eles não são necessariamente o mesmo número de arquivos de cada vez).

Eu percebi que eu poderia fazer isso de uma forma assim: ls | head -n 21 | sed -r 's|(.*)|mv /path/to/folder1|' | sh

Estou quase certo de que há uma maneira melhor, então, o que seria?

EDIT: Então, isso teria funcionado bem, mas eu me lembrei ...

Eu não estou preso usando um terminal, então usei um gerenciador de arquivos para clicar e arrastar. A questão ainda permanece.

    
por Rob 19.01.2012 / 20:27

3 respostas

20

Desde que você disse que nem sempre são exatamente 21 arquivos que você precisa mover os arquivos manualmente, e para fazer isso efetivamente você poderia usar expansão de contraventamentos :

mv filename{001..21} dir1
mv filename{022..53} dir2
...
    
por 20.01.2012 / 01:28
1

Isso moverá os arquivos como você descreveu (exceto que o segundo intervalo seria de 022 a 042 para os segundos 21 arquivos).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done
    
por 19.01.2012 / 21:26
0

O que eu quero dizer é mover muitos arquivos (como dez mil ou um milhão), o shell irá reclamar da lista de arquivos por muito tempo se você usar {1..20}, então

Em zsh , você pode carregar o mv incorporado:

setopt extended_glob zmodload

zsh/files

depois de fazer isso, você pode usar o comando like:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

ou se você estiver escrevendo alguns scripts de shell, você pode fazer algo assim:

for i in 'seq $start $end';  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

Se você não estiver usando o zsh, poderá consultar o link

    
por 20.07.2015 / 17:23

Tags