Gibt es eine Möglichkeit, 30 zufällige Dateien aus einem Verzeichnis mit Standard-Linux-Befehlen aufzulisten? (in zsh
)
Die hier beschriebene Top-Antwort funktioniert bei mir sort
nicht (erkennt die Option nicht -R
)
Gibt es eine Möglichkeit, 30 zufällige Dateien aus einem Verzeichnis mit Standard-Linux-Befehlen aufzulisten? (in zsh
)
Die hier beschriebene Top-Antwort funktioniert bei mir sort
nicht (erkennt die Option nicht -R
)
Antworten:
Da Sie zsh erwähnen:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
Sie können print
mit sagen ogg123
und *
mit sagen ersetzen**/*.ogg
Versuchen Sie, den ls
Ausgang zu leiten shuf
, z
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
Das -n
Flag gibt an, wie viele zufällige Dateien Sie möchten.
command not found
(nicht installiert): /
ls
.
Mit ein bisschen Perl ist das ganz einfach zu lösen. Wählen Sie vier zufällige Dateien aus dem aktuellen Verzeichnis aus:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
Für die Produktion würde ich jedoch ein erweitertes Skript verwenden, das sich nicht auf die ls
Ausgabe stützt, ein beliebiges Verzeichnis akzeptiert, Ihre Argumente überprüft usw. Beachten Sie, dass die Zufallsauswahl selbst immer noch nur ein paar Zeilen umfasst.
#!/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
) für das OP nicht ausreichend war. Was ist und was nicht Standard Unix - Perl gibt es überall und es löst das Problem kurz und bündig. Wenn ich dies als Perl-Einzeiler angegeben hätte, hätte das als "Befehlszeile" gezählt? Ist die Tatsache, dass Perl mächtig ist, wirklich ein Argument gegen die Existenz dieser Antwort?
perl -MList::Util=shuffle -e 'print shuffle(
ls )' | head -n 4
Ist das eher das, was Sie gesucht haben?
Eine einfache Lösung, die das Parsen von ls vermeidet und auch mit Leerzeichen arbeitet:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf
.
shuf
wird in der Frage nicht erwähnt. Diese Antwort ist für andere Benutzer weiterhin hilfreich.
Ein Oneliner, der nur Zsh verwendet:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
Dasselbe gilt für Bash, wo Array-Indizes auf Null basieren:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
Beachten Sie, dass keine der Versionen Duplikate berücksichtigt.