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
...
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.
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
...
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
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