Mover um intervalo de arquivos numerados?

Mover um intervalo de arquivos numerados?

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. (001 a 021 para a pasta 1, 022 a 053 para a pasta 2, não são necessariamente o mesmo número de arquivos de cada vez).

Achei que poderia fazer isso de uma maneira nojenta assim:ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Tenho quase certeza de que existe uma maneira melhor, então qual seria?

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

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

Responder1

Como você disse que nem sempre são exatamente 21 arquivos necessários para movê-los manualmente, e para fazer isso de maneira eficaz, você pode usarexpansão de cinta:

mv filename{001..21} dir1
mv filename{022..53} dir2
...

Responder2

Isso moverá os arquivos conforme 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

Responder3

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

Emzsh, você pode carregar omvconstruídas em:

setopt estendido_glob zmodload

zsh/arquivos

depois de fazer isso, você pode usar comandos como:

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

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

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

se você não estiver usando zsh, você pode consultarhttps://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long

informação relacionada