Cómo mover los primeros archivos x

21

Tengo esta enorme carpeta con miles de archivos desordenados. ¿Es factible mover los primeros 5000 a una subcarpeta mediante el mvcomando? Por ahora muevo archivos con

 mv *some_pattern* ./subfolder1/

Por ahora, muevo las imágenes al azar, no es realmente importante si no hay exactamente 5000 archivos en cada subcarpeta. Hay una mejor manera de hacerlo?

Fabinout
fuente
Consulte también Distribuir miles de archivos en subcarpetas
Stéphane Chazelas

Respuestas:

23
mv `ls | head -500` ./subfolder1/
schaiba
fuente
12
(suponiendo que ninguno de los nombres de archivo contenga espacio, tabulación, nueva línea, estrella, corchete abierto, caracteres de signo de interrogación o comience con -o .y suponiendo subfolder1que no aparezca en esa lista.)
Stéphane Chazelas
@ StéphaneChazelas si el archivo contiene esos, ¿cómo modificamos el comando?
Peiti Li
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas
15

Con zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

Para mover hasta 5000 archivos regulares en el orden en que están en el directorio.

Para los primeros 5000 en la lista ordenada lexicográficamente:

mv -- *(D.[1,5000]) ./subfolder1

Si obtiene un error sobre la lista arg demasiado tiempo . Puede usar zshel mvcomando buitin emitiendo:

zmodload zsh/files

primero.

POSIXY:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Stéphane Chazelas
fuente
2
El fragmento POSIX es una joya
iruvar
¿Qué pasa si recibo el error usando bash?
Brian Thomas
8

Una versión que es simple y admite caracteres especiales, espacios, etc.

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

Para que esto funcione tal como está dir2debe existir y debe ejecutarlo desde el directorio principal de dir1y dir2.

Esto moverá 1000 archivos de dir1 a dir2.

Luis Antolín Cano
fuente
¡Buena esa! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ para mover 1000 archivos más grandes en dir1 (-S enumera el archivo por tamaño)
oneklc
1
Tenga en cuenta que ls -Qno produce una salida compatible con xargsel formato de entrada esperado. Ayuda para nombres de archivos que contienen caracteres de espacio, pero no para comillas dobles o barras diagonales inversas y daños para nombres de archivos que contienen caracteres de control, incluyendo TAB.
Stéphane Chazelas
3

Es posible que deba hacer algo como esto:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

Este script funciona en bash, ksh, sh y múltiples variantes de UNIX.

Karlson
fuente
1
(siempre que ninguno de los nombres de archivo contenga espacio, tabulación, nueva línea, estrella, corchete abierto, caracteres de signo de interrogación o comience con - o. y siempre destinationque no aparezca en esa lista.)
Stéphane Chazelas
@StephaneChazelas True. Esta no es una solución completa, solo un método para tratar el problema.
Karlson
3
  1. Ir al directorio desde el que desea mover archivos
  2. ejecutar debajo del comando

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

En el findcomando, .(punto) denota el directorio actual

busca archivos que comienzan con Hello y terminan con gz, los primeros 5000 archivos se moverán a la ruta /data01/path/

Pratik Hiremath
fuente
1

Pude hacer con éxito un movimiento de 50,000 sin el error mv bash como este

 ls | head -50000 | xargs -I{} sudo mv {} 01/

Curiosamente, esto estaba en un recurso compartido de samba, por lo que el límite de 50k se debe a que la GUI del Explorador de Windows no le gustan más de 60k archivos en un directorio en general.

Brian Thomas
fuente