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 ( sort
tidak 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 ( sort
tidak mengenali opsi -R
)
Jawaban:
Karena Anda menyebutkan zsh:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
Anda dapat mengganti print
dengan mengatakan ogg123
dan *
dengan mengatakan**/*.ogg
Coba perpip ls
output ke shuf
, mis
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
The -n
flag 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 ls
output, 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 4
Apakah 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
.
shuf
tidak 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.