Normalmente isso seria um oneliner, mas pode ser uma má idéia processar um número tão grande de arquivos (name) s diretamente, então vou usar um arquivo temporário aqui.
#!/bin/bash
a=$(mktemp)
find /path/to/dir -type f | shuf -n $(shuf -i200000-300000 -n1) >$a
while IFS='' read -r l || [[ -n "$l" ]]; do
cp "$l" /path/to/out/dir
done <$a
Isso localizará todos os arquivos localizados em /path/to/dir
, embaralhe-os e salve um número aleatório de linhas (entre 200.000 e 300.000, conforme solicitado) da saída em tempfile $a
. O while
loop apenas copia todos os arquivos da lista para /path/to/out/dir
.
Bobagem, não precisamos de um arquivo temporário, apenas passamos para o loop while
ou - o que eu prefiro - para tr
e xargs
:
#!/bin/bash
find /path/to/dir -type f | shuf -n $(shuf -i200000-300000 -n1) |\
tr '\n' '#!/bin/bash
a=$(mktemp)
find /path/to/dir -type f | shuf -n $(shuf -i200000-300000 -n1) >$a
while IFS='' read -r l || [[ -n "$l" ]]; do
cp "$l" /path/to/out/dir
done <$a
' | xargs -0 -n1 cp -t /path/to/out/dir
Dessa forma, você pode especificar quantos nomes de arquivos cada invocação de cp
deve receber por meio da opção xargs
' -n
.