Czy istnieje sposób wyświetlenia listy powiedzmy 30 losowych plików z katalogu przy użyciu standardowych poleceń systemu Linux? (w zsh
)
Najlepsza odpowiedź opisana tutaj nie działa dla mnie ( sort
nie rozpoznaje opcji -R
)
Czy istnieje sposób wyświetlenia listy powiedzmy 30 losowych plików z katalogu przy użyciu standardowych poleceń systemu Linux? (w zsh
)
Najlepsza odpowiedź opisana tutaj nie działa dla mnie ( sort
nie rozpoznaje opcji -R
)
Odpowiedzi:
Ponieważ wspominasz o zsh:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
Możesz zamienić na print
say ogg123
i na *
say**/*.ogg
Spróbuj przesłać dane ls
wyjściowe do shuf
, np
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
-n
Flaga określa ile losowe pliki, które chcesz.
command not found
(nie zainstalowany): /
ls
.
Łatwo to rozwiązać za pomocą odrobiny Perla. Wybierz cztery pliki losowo z bieżącego katalogu:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
Jednak do użytku produkcyjnego wybrałbym rozszerzony skrypt, który nie opiera się na ls
danych wyjściowych, może zaakceptować dowolny katalog, sprawdza twoje argumenty itp. Zauważ, że sam losowy wybór to wciąż tylko kilka wierszy.
#!/usr/bin/perl
use strict;
use warnings;
use List::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 input
if ( $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 filenames
foreach my $selected ( (shuffle(@filenames))[0..$n_random-1] ) {
print "$selected\n";
}
shuf
) nie była wystarczająca dla PO. Co do tego, co jest i nie jest standardem Unix - Perl istnieje wszędzie i rozwiązuje problem zwięźle i solidnie. Gdybym podał to jako linijkę Perla, czy liczyłoby się to jako „linia poleceń”? Czy fakt, że Perl jest potężny, naprawdę jest argumentem przeciwko istnieniu tej odpowiedzi?
perl -MList::Util=shuffle -e 'print shuffle(
ls )' | head -n 4
Czy to bardziej to, czego szukałeś?
Proste rozwiązanie, które pozwala uniknąć parsowania ls, a także działa ze spacjami:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf
.
shuf
nie jest wspomniane w pytaniu. Ta odpowiedź będzie nadal pomocna dla innych użytkowników.
Oneliner wykorzystujący tylko Zsh:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
To samo dotyczy Bash, gdzie indeksy tablicowe są zerowe:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
Pamiętaj, że żadna wersja nie uwzględnia duplikatów.