¿Mover una variedad de archivos numerados?

¿Mover una variedad de archivos numerados?

Tengo 291 archivos numerados (que comienzan en 001 - título y terminan en 291 - título) que deben moverse a directorios separados. (001 a 021 a la carpeta 1, 022 a 053 a la carpeta 2, no son necesariamente la misma cantidad de archivos cada vez).

Pensé que podría hacerlo de una manera asquerosa como esta:ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Estoy casi seguro de que hay una manera mejor, entonces, ¿cuál sería?

EDITAR: Eso habría funcionado bien, pero lo recordé...

No estoy atrapado usando una terminal, así que usé un administrador de archivos para hacer clic y arrastrar. Sin embargo, la pregunta sigue en pie.

Respuesta1

Como dijiste que no siempre son exactamente 21 archivos los que necesitas para moverlos manualmente, y para hacerlo de manera efectiva, puedes usarexpansión de corsé:

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

Respuesta2

Esto moverá los archivos como lo describió (excepto que el segundo rango sería de 022 a 042 para los segundos 21 archivos).

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

Respuesta3

Lo que quiero decir es que al mover muchos archivos (como diez mil o un millón), Shell se quejará de que la lista de archivos es demasiado larga si solo usas {1..20}, así que

Enzsh, puedes cargar elmvincorporado:

setopt extended_glob zmodload

zsh/archivos

Después de hacer eso, puedes usar comandos como:

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

o si estás escribiendo algunos scripts de shell, puedes hacer algo como esto:

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

Si no está utilizando zsh, puede consultarhttps://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long

información relacionada