Apakah ada cara untuk membuat daftar katakanlah, 30 file acak dari direktori menggunakan perintah Linux standar? (dalam zsh)
Jawaban teratas yang dijelaskan di sini tidak berfungsi untuk saya ( sorttidak mengenali opsi -R)
Apakah ada cara untuk membuat daftar katakanlah, 30 file acak dari direktori menggunakan perintah Linux standar? (dalam zsh)
Jawaban teratas yang dijelaskan di sini tidak berfungsi untuk saya ( sorttidak mengenali opsi -R)
Jawaban:
Karena Anda menyebutkan zsh:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
Anda dapat mengganti printdengan mengatakan ogg123dan *dengan mengatakan**/*.ogg
Coba perpip lsoutput ke shuf, mis
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
The -nflag menentukan berapa banyak file acak yang Anda inginkan.
command not found(tidak terpasang): /
ls .
Sangat mudah untuk menyelesaikan ini dengan sedikit Perl. Pilih empat file secara acak dari direktori saat ini:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
Untuk penggunaan produksi, saya akan menggunakan skrip diperluas yang tidak bergantung pada lsoutput, dapat menerima dir, memeriksa args Anda, dll. Perhatikan bahwa pemilihan acak itu sendiri masih hanya beberapa baris.
#!/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) tidak cukup untuk OP. Seperti apa standar Unix dan Perl - ada di mana-mana, dan itu memecahkan masalah dengan ringkas dan kuat. Jika saya memberikan ini sebagai Perl one-liner, apakah itu akan dianggap sebagai 'command line'? Apakah fakta bahwa Perl sangat kuat merupakan argumen yang menentang keberadaan jawaban ini?
perl -MList::Util=shuffle -e 'print shuffle(ls )' | head -n 4Apakah ini lebih seperti apa yang Anda cari?
Solusi sederhana yang menghindari penguraian ls dan juga bekerja dengan spasi:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf.
shuftidak disebutkan dalam pertanyaan. Jawaban ini masih akan bermanfaat bagi pengguna lain.
Oneliner yang tidak menggunakan apa-apa selain Zsh:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
Sama di Bash, di mana indeks array berbasis nol:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
Perhatikan bahwa tidak ada versi yang mengambil duplikat ke akun.