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.