標準のLinuxコマンドを使用して、ディレクトリから30個のランダムなファイルのセットをリストする方法はありますか?(にzsh
)
どのOSを使用しているのか興味があります。
—
ixtmixilix
標準のLinuxコマンドを使用して、ディレクトリから30個のランダムなファイルのセットをリストする方法はありますか?(にzsh
)
回答:
zshに言及しているので:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
print
say ogg123
とsay で置き換えることができ*
ます**/*.ogg
ls
出力をshuf
にパイプしてみてください、例えば
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
-n
フラグは、あなたが望むどのように多くのランダムなファイルを指定します。
command not found
(インストールされていない):/
ls
。
これをちょっとしたPerlで解決するのはとても簡単です。現在のディレクトリからランダムに4つのファイルを選択します。
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
ただし、本番用には、ls
出力に依存せず、任意のディレクトリを受け入れ、引数をチェックするなどの拡張スクリプトを使用します。ランダム選択自体はまだ数行であることに注意してください。
#!/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
)がOPにとって十分ではなかったため、これを提供しました。標準のUnixとそうでないものについては、Perlはどこにでも存在し、問題を簡潔かつ堅牢に解決します。これをPerlのワンライナーとして指定した場合、それは「コマンドライン」としてカウントされますか?Perlが強力であるという事実は、本当にこの答えの存在に対する議論なのでしょうか?
perl -MList::Util=shuffle -e 'print shuffle(
ls )' | head -n 4
これはあなたが探していたものに似ていますか?
Zshのみを使用するoneliner:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
配列インデックスがゼロベースのBashでも同じです:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
どちらのバージョンも重複を考慮しないことに注意してください。