
Tengo alrededor de 9000 archivos en un directorio y quiero dividirlos en 90 archivos en 100 directorios por orden de nombre de archivo, ignorando el resto. En¿Copiar varios archivos del nombre de archivo X al nombre de archivo Y?,calebescribió en uncomentario:
Si el objetivo es simplemente agruparlos, ¡hay una manera MUCHO más fácil!
ls | xargs -iX -n20 cp X target_folder/
ejecutaría cp en archivos en lotes de 20 hasta que estuvieran todos listos.
Entonces, basándose en el uso de xargs, ¿cómo podría cambiar target_folder para crear una nueva carpeta y repetir el comando 100 veces?
Respuesta1
En bash
, prueba el siguiente código:
#!/bin/bash
c=0
for f; do
if ! ((c % 100)); then
folder=folder_$(printf "%03d\n" $c)
mkdir -p $folder
fi
[[ -d "$f" ]] || mv "$f" "$folder"
((c++))
done
Ejecute el script así:
./script.bash *
Respuesta2
Ese comando no se parece mucho a lo que estás intentando hacer. xargs
puede ayudar, pero es complicado de usar a menos que sepa que los nombres de sus archivos no contienen espacios en blanco ni comillas. Aquí hay un bucle de shell que distribuye archivos en subdirectorios recién creados, 90 por directorio.
set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
slice="$slice \"\${$i}\""
i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
mkdir part$i
eval "mv $slice part$i"
shift 90
done
# 0 to 89 files remain in the current directory
Respuesta3
parallel
admite la ejecución de múltiples comandos con \;
y {#}
es el número de secuencia:
ls|parallel -n90 mkdir {#}\;mv {} {#}
O si los nombres de los archivos no contienen espacios, comillas ni barras invertidas:
i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)