¿Existe una forma elegante y rápida de copiar una determinada estructura de directorios y seleccionar solo una cantidad aleatoria de archivos para copiar con ella? Entonces, por ejemplo, tienes la estructura:
--MainDir
--SubDir1
--SubSubDir1
--file1
--file2
--...
--fileN
--...
--SubSubDirN
--file1
--file2
--...
--fileN
--...
Quiero copiar toda la estructura de carpetas, pero elijo solo una cantidad específica de archivos aleatorios de {files1-filesN} de cada SubSubDir para copiarlos.
Respuesta1
Como etiquetó esto como, linux
asumiré las utilidades GNU.
Copie la estructura del directorio de $src
a $dest
:
find "$src" -type d -print0 | cpio -padmv0 "$dest"
Copie también una muestra aleatoria de $nfile
archivos de cada subdirectorio hoja de $src
:
find "$src" -type d -links 2 -exec \
sh -c 'find "$1" -type f -print0 | shuf -z -n "$2"' sh {} "$nfiles" \; | \
cpio -padmv0 "$dest"
Aquí el primero find
busca subdirectorios hoja ( -links 2
), luego el segundo find
busca archivos en cada uno de estos subdirectorios. shuf
elige una muestra aleatoria de archivos y finalmente cpio
los copia.
Respuesta2
Primero busque todos los directorios:
find MainDir -type d
Luego analice estos directorios en un script
find MainDir -type d -exec ./randomCopy.sh 2 {} \;
, cual
- Crea el directorio de destino.
- Copia una cantidad aleatoria de archivos.
En este caso se copian 2 archivos aleatorios.
En mi ejemplo, el script randomCopy.sh
se ve así:
#!/bin/bash
cnt="$1"
dir="$2"
mkdir -p "TARGET/$dir"
# see: https://stackoverflow.com/questions/414164/how-can-i-select-random-files-from-a-directory-in-bash
find "$dir" -maxdepth 1 -type f | sort -R | tail -n $cnt | while read file; do
# copy the file
cp "$file" "TARGET/$dir/"
done
Y no olvide hacer que el script sea ejecutable: chmod +x randomCopy.sh
.
Reemplace la cadena TARGET
con su directorio de destino o use una tercera opción de secuencia de comandos.
Esta prueba de concepto se ejecuta dentro de mi directorio de prueba, pero puede haber mucho que mejorar.