Copie la estructura de directorios con un número aleatorio de archivos

Copie la estructura de directorios con un número aleatorio de archivos

¿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, linuxasumiré las utilidades GNU.

Copie la estructura del directorio de $srca $dest:

find "$src" -type d -print0 | cpio -padmv0 "$dest"

Copie también una muestra aleatoria de $nfilearchivos 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 findbusca subdirectorios hoja ( -links 2), luego el segundo findbusca archivos en cada uno de estos subdirectorios. shufelige una muestra aleatoria de archivos y finalmente cpiolos 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

  1. Crea el directorio de destino.
  2. Copia una cantidad aleatoria de archivos.

En este caso se copian 2 archivos aleatorios.

En mi ejemplo, el script randomCopy.shse 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 TARGETcon 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.

información relacionada