
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