Estranho ... deveria fazer parte do coreutils. Se o seu coreutils for antigo, o comando não estará lá.
Renan
6
Essa é a maneira mais rápida e suja, e eu a usaria também - para um script único. Para algo mais durável, evite analisar a saída dels .
janmoesen
@janmoesen Eu não sabia disso. Obrigado!
Renan
@Renan Nem todos os Unix têm o núcleo GNU instalado por padrão.
Kusalananda
2
É muito fácil resolver isso com um pouquinho de Perl. Selecione quatro arquivos aleatoriamente no diretório atual:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)'| head -n 4
No entanto, para uso em produção, eu usaria um script expandido que não depende da lssaída, pode aceitar qualquer dir, verifica seus argumentos, etc. Observe que a seleção aleatória em si ainda tem apenas algumas linhas.
#!/usr/bin/perl use strict;use warnings;useList::Util qw( shuffle );if(@ARGV<2){die"$0 - List n random files from a directory\n"."Usage: perl $0 n dir\n";}my $n_random = shift;my $dir_name = shift;
opendir(my $dh, $dir_name)||die"Can't open directory $dir_name: $!";# Read in the filenames in the directory, skipping '.' and '..'my@filenames= grep {!/^[.]{1,2}$/} readdir($dh);
closedir $dh;# Handle over-specified inputif( $n_random > $#filenames ) {print"WARNING: More values requested ($n_random) than available files (".@filenames.") - truncating list\n";
$n_random =@filenames;}# Randomise, extract and print the chosen filenamesforeachmy $selected ((shuffle(@filenames))[0..$n_random-1]){print"$selected\n";}
Imho um script Perl não é um 'comando unix padrão'. Esse problema é fácil de resolver em qualquer linguagem de script de alto nível, como Perl, Python ou Ruby, mas é mais interessante se estiver diretamente na linha de comando.
gerrit
1
@gerrit - Entendo o seu ponto. Forneci isso porque a resposta preferida (usando shuf) não era suficiente para o OP. Quanto ao que é e não é padrão, o Unix - Perl existe em todos os lugares e resolve o problema de maneira sucinta e robusta. Se eu tivesse dado isso como uma linha única do Perl, isso contaria como 'linha de comando'? O fato de Perl ser poderoso é realmente um argumento contra a existência dessa resposta?
#
Eu diria que é uma resposta para uma pergunta diferente. É claro que em qualquer linguagem de programação com todos os recursos esse problema é trivial, para mim a parte interessante da pergunta é se ela pode ser feita / sem / recorrendo a um script ~ 20 LOC; linguagens de script são poderosas, mas não acho que o Perl classifique como um comando (como o OP estava pedindo; e não, se você tivesse dado uma linha de comando de 200 caracteres invocando o Perl, teria a mesma opinião).
Gerrit 18/09/12
@gerrit - Talvez eu possa ser mais claro. Dê uma olhada na minha edição: perl -MList::Util=shuffle -e 'print shuffle(ls )' | head -n 4É mais parecido com o que você estava procurando?
ire_and_curses
Sim, removi meu voto negativo, que reconhecidamente foi um pouco duro.
Isso pode listar o mesmo arquivo mais de uma vez. Evitar isso é uma parte significativa do problema.
Gilles 'SO- stop be evil'
Gilles: está certo, e foi por isso que eu disse "Observe que nenhuma das versões leva em consideração as duplicatas". Você ainda pode fazer isso no Bash puro, se não se importar com a complexidade do tempo e reconstruir a matriz sempre que remover uma aleatória. Nem mesmo perto de uma fila, então, mas é claro que isso não era um requisito.
Respostas:
Desde que você está mencionando zsh:
Você pode substituir
print
por dizerogg123
e*
dizer**/*.ogg
fonte
Tente canalizar a
ls
saída parashuf
, por exemploO
-n
sinalizador especifica quantos arquivos aleatórios você deseja.fonte
command not found
(não instalado): /ls
.É muito fácil resolver isso com um pouquinho de Perl. Selecione quatro arquivos aleatoriamente no diretório atual:
No entanto, para uso em produção, eu usaria um script expandido que não depende da
ls
saída, pode aceitar qualquer dir, verifica seus argumentos, etc. Observe que a seleção aleatória em si ainda tem apenas algumas linhas.fonte
shuf
) não era suficiente para o OP. Quanto ao que é e não é padrão, o Unix - Perl existe em todos os lugares e resolve o problema de maneira sucinta e robusta. Se eu tivesse dado isso como uma linha única do Perl, isso contaria como 'linha de comando'? O fato de Perl ser poderoso é realmente um argumento contra a existência dessa resposta?perl -MList::Util=shuffle -e 'print shuffle(
ls)' | head -n 4
É mais parecido com o que você estava procurando?Uma solução simples que evita a análise de ls e também trabalha com espaços:
fonte
shuf
.shuf
não é mencionado na pergunta. Esta resposta ainda será útil para outros usuários.Um oneliner usando nada além de Zsh:
O mesmo no Bash, onde os índices da matriz são baseados em zero:
Observe que nenhuma das versões leva em consideração as duplicatas.
fonte