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?


Respuestas:


23
mv `ls | head -500` ./subfolder1/

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/

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.


¡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.


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/


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.

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.