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:
- Mover una cierta cantidad de archivos del disco a mi disco duro.
- Cree subcarpetas (con 1000 archivos cada subcarpeta) y distribuya archivos entre ellas.
- 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 new
llamado 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 xargs
y 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 -name
o -regex
para seleccionarlos. agregue la(s) opción(es) inmediatamente después del -type f
. por ejemplo, si desea mover sólo .txt
archivos:
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 -d
la 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 \n
en el nombre. -R -1
no es posix, es una extensión de freebsd xargs
, puede eliminar esa opción de forma segura, pero la mv
operació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