¿Cómo copiar archivos/tar desde una carpeta con una gran cantidad de archivos?

¿Cómo copiar archivos/tar desde una carpeta con una gran cantidad de archivos?

Así que cometí un pequeño error estúpido. Durante el proceso de recopilación de datos de una fuente, descargué todo en la raíz de mi disco externo, que ahora tiene más de 600.000 archivos (un total de 23 gigas). Aquí están las siguientes opciones que me gustaría hacer:

  1. Mover una cierta cantidad de archivos del disco a mi disco duro.
  2. Cree subcarpetas (con 1000 archivos cada subcarpeta) y distribuya archivos entre ellas.
  3. Tar todo o parte de él (digamos 50.000 archivos) y muévalos a mi disco.

Pero cualquier cosa que intento hacer parece que lleva una eternidad. ¿Alguien puede ayudarme sobre la forma óptima/más eficiente de hacer cualquiera de estas cosas? Gracias.

Respuesta1

Lo siguiente creará un subdirectorio llamado new, y luego 50 subdirectorios numerados de newllamado new/01.. new/50. Luego moverá un máximo de 1000 archivos del directorio actual a cada uno de los new/*directorios.

NOTA1: No funcionará si alguno de losnombres de archivostienen nuevas líneas ( \n) en ellos.

NOTA2: esto requiere GNU xargsy GNU mv. Está ejecutando Linux, por lo que estos son estándar.

Puede cambiar los números (50 y 1000) y el directorio base para adaptarlo a sus necesidades.

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done

Si todos los archivos que desea mover coinciden con un patrón particular, puede usar las opciones de búsqueda -nameo -regexpara seleccionarlos. agregue la(s) opción(es) inmediatamente después del -type f. por ejemplo, si desea mover sólo .txtarchivos:

find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"

Una versión que no sea GNU no puede usar mv -t. Tampoco puede usar xargs -dla opción, pero puede usarla tr '\n' '\0'para convertir nuevas líneas en caracteres NUL para introducirlos xargs -0r; nuevamente, esto funciona con cualquier archivo que no tenga un nombre \nen el nombre. -R -1no es posix, es una extensión de freebsd xargs, puede eliminar esa opción de forma segura, pero la mvoperación se ejecutará mucho más lenta.

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done

información relacionada