Suponha que exista um diretório contendo 300 arquivos de dados. Quero selecionar aleatoriamente 200 desses arquivos e movê-los para outro diretório. Existe uma maneira de fazer isso no Unix / Linux?
linux
shell
command-line
filesystems
directory
bit-question
fonte
fonte
list.files()
...shuf
ehead
(ou o uso apenasshuf -n
, deve ter lido a página man ...)Respostas:
Se o seu sistema possui
shuf
, você pode usá-lo de maneira bastante conveniente (mesmo lidando com nomes de arquivos feios):Se você não tem,
shuf
mas tem umsort
que leva-R
, isso deve funcionar:fonte
shuf
não é chamadotros
porque ele faz o oposto de classificação.)fonte
Coloque todos os nomes de arquivos em uma matriz chamada "arquivos" no bash:
tamanho da matriz:
defina 2/3 deles como tamanho da amostra:
Isso selecionará duplicatas e
nãoserá testado com nomes de arquivos com espaços em branco e outros.A maneira mais simples de evitar duplicatas é iterar sobre todos os arquivos e escolher cada um com chance de 2/3, mas isso não leva necessariamente a 200 arquivos.
Isso removerá um arquivo se ele tiver sido escolhido da lista e atender aos seus requisitos:
fonte
$RANDOM
pode ter apenas valores de 0 a 32767; portanto, isso não funcionará corretamente se você tiver mais de 32768 arquivos. Além disso, a busca é influenciada pelos primeiros arquivos.Se isso precisar ser estatisticamente aleatório, você não deve usá-lo
RANDOM % ${#keys[@]}
. Considerar:$RANDOM
tem 32768 valores únicosPortanto, ao selecionar o primeiro item, há uma chance de 110/32768 ~ = 0,333569% para cada um dos 68 primeiros elementos e 109/32768 ~ = 0,33264% de chance para cada um dos outros 232 elementos a serem selecionados. A escolha é repetida várias vezes com chances diferentes, mas inclinado para os primeiros elementos sempre que
32768 % ${#keys[@]} -ne 0
, portanto, o erro se agrava.Isso deve ser imparcial e funciona com qualquer nome de arquivo:
fonte
A solução de Kevin funciona muito bem! Outra coisa que eu usei muito, porque acho mais fácil lembrar de cima, é algo como:
fonte
Um forro no bash:
fonte