Se você tiver shuf
, ele permitirá que você faça o que quiser, desde que nenhum nome de arquivo tenha um caractere de nova linha e não haja subdiretórios:
mapfile -t sample < <(shuf -n 1000 -e given_directory/*)
mv "${sample[@]}" other_directory
Se houver subdiretórios, você poderá obter a lista de arquivos usando find
em vez do glob. Ou você pode oversample e filtrar. find
também ajudará você a lidar com arquivos que poderiam ter novas linhas em seus nomes (o que é realmente uma má ideia, mas isso não significa necessariamente que você possa ignorar a possibilidade), pois você pode usar a ação -print0
combinada com o sinal -z
para shuf
. Por exemplo,
find given_directory -type f -print0 |
shuf -z -n 1000 |
xargs -0 mv -t other_directory
mv -t
é uma extensão do Gnu (muito útil) que permite fornecer o diretório de destino no início da linha de comando, que funciona bem com o modelo xargs
/ find -exec
de colocar vários argumentos no final de a linha de comando.