Mover un rango de archivos numerados?


14

Tengo 291 archivos numerados (comenzando en 001 - título y terminando en 291 - título) que necesitan moverse a directorios separados. (001 a 021 a la carpeta 1, 022 a 053 a la carpeta 2, no son necesariamente el mismo número 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 mejor manera, entonces, ¿cuál sería?

EDITAR: Eso hubiera funcionado bien, pero 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.


1
¿Desea 21 subcarpetas en la carpeta 1 y 22 carpetas en la carpeta 2?
— Daniel Beck

¿Has revisado unix.SE? Aquí hay un buen hilo: unix.stackexchange.com/questions/12976/…
— chrisjlee

@ DanielBeck no, quiero que los archivos se muevan a cada carpeta. Hay un número diferente de archivos que van a cada carpeta.
— Rob

@ ChrisJ.Lee Eso es bastante similar a lo que estaba haciendo / he hecho antes, me gusta. Como los archivos coinciden con otros archivos en otra carpeta, pude ls -l | grep ^- | wc -lobtener el número de líneas.
— Rob

1
@Rob Derecha. Aún así, un número diferente de archivos en cada directorio. Automatizar eso (incluidas las reglas) es más esfuerzo que hacerlo usted mismo varias veces.
— Daniel Beck

Respuestas:


25

Como dijiste que no siempre son exactamente 21 archivos de los que necesitas mover los archivos manualmente, y para hacerlo de manera efectiva puedes usar la expansión de llaves :

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

Parece que podría funcionar, lo probaré.
— Rob

1
Esto funciona perfectamente si agrega un comodín después de los corchetes. Esto es exactamente lo que necesitaba.
— Rob

2
Si el número está en el medio del nombre, puede escribir file{001..21}name, no tiene que usar comodines. De todos modos, feliz de que te haya funcionado.
— drrlvn

1

Esto moverá los archivos como lo describió (excepto que el segundo rango sería 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

No siempre son 21 archivos, pero gracias.
— Rob

0

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

En zsh , puede cargar el mv incorporado:

setopt extended_glob zmodload

zsh / files

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

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

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

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

si no está usando zsh, puede consultar /unix/128559/solving-mv-argument-list-too-long


Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. ¿A qué respuesta hace referencia como la "respuesta más detallada"?
— Ramhound

Esto realmente no responde la pregunta ya que OP quiere mover diferentes archivos a diferentes directorios.
— DavidPostill
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.