Copie a estrutura de diretórios com um número aleatório de arquivos

0

Existe uma maneira elegante e rápida de copiar uma determinada estrutura de diretórios e selecionar apenas uma quantidade aleatória de arquivos para serem copiados. Então, por exemplo, você tem a estrutura:

--MainDir
  --SubDir1
    --SubSubDir1
      --file1
      --file2
      --...
      --fileN
    --...
    --SubSubDirN
      --file1
      --file2
      --...
      --fileN
  --...

Eu quero copiar toda a estrutura de pastas, mas escolher apenas um número específico de arquivos aleatórios de {files1-filesN} de cada SubSubDir para ser copiado.

    
por uitty400 31.05.2017 / 12:40

2 respostas

1

Como você marcou isso como linux , assumirei os utilitários GNU.

Copie a estrutura de diretórios de $src para $dest :

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

Copie também uma amostra aleatória de arquivos $nfile de cada subdiretório folha 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"

Aqui, o primeiro find localiza os subdiretórios da folha ( -links 2 ), depois o segundo find localiza os arquivos em cada um desses subdiretórios. shuf escolhe uma amostra aleatória de arquivos e, finalmente, cpio copia-os.

    
por 31.05.2017 / 14:20
0

Primeiro, encontre todos os diretórios:

find MainDir -type d

Em seguida, analise esses diretórios para um script

find MainDir -type d -exec ./randomCopy.sh 2 {} \;

,

  1. Cria o diretório de destino
  2. Copiar é uma quantidade aleatória de arquivos.

Nesse caso, dois arquivos aleatórios são copiados.

No meu exemplo, o script randomCopy.sh tem esta aparência:

#!/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

E não se esqueça de tornar o script executável: chmod +x randomCopy.sh .

Substitua a string TARGET pelo seu diretório de destino ou use uma terceira opção de script.

Esta prova de conceito está sendo executada dentro do meu diretório de teste, mas pode haver muito a melhorar.

    
por 31.05.2017 / 13:16