มีวิธีในการแสดงรายการชุดของไฟล์ที่สุ่ม 30 ไฟล์จากไดเรกทอรีโดยใช้คำสั่ง Linux มาตรฐานหรือไม่? (ในzsh
)
คำตอบสูงสุดที่อธิบายไว้ที่นี่ไม่ทำงานสำหรับฉัน ( sort
ไม่รู้จักตัวเลือก-R
)
มีวิธีในการแสดงรายการชุดของไฟล์ที่สุ่ม 30 ไฟล์จากไดเรกทอรีโดยใช้คำสั่ง Linux มาตรฐานหรือไม่? (ในzsh
)
คำตอบสูงสุดที่อธิบายไว้ที่นี่ไม่ทำงานสำหรับฉัน ( sort
ไม่รู้จักตัวเลือก-R
)
คำตอบ:
เนื่องจากคุณกำลังพูดถึง zsh:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
คุณสามารถแทนที่print
ด้วยคำพูดogg123
และ*
ด้วยคำพูด**/*.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
(ไม่ได้ติดตั้ง): /
มันค่อนข้างง่ายที่จะแก้ปัญหานี้ด้วย Perl เล็กน้อย เลือกสี่ไฟล์โดยการสุ่มจากไดเรกทอรีปัจจุบัน:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
สำหรับการใช้งานจริงฉันจะไปกับสคริปต์ที่ไม่ต้องพึ่งพาls
เอาท์พุทสามารถรับ dir ใด ๆ ตรวจสอบ args ของคุณเป็นต้นโปรดทราบว่าการเลือกแบบสุ่มนั้นยังคงเป็นเพียงสองบรรทัด
#!/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 One-Liner, นั่นจะนับเป็น 'command line' หรือไม่? ความจริงแล้ว Perl มีประสิทธิภาพจริงๆแล้วมันขัดแย้งกับการมีอยู่ของคำตอบนี้หรือไม่?
perl -MList::Util=shuffle -e 'print shuffle(
ls )' | head -n 4
นี่เป็นสิ่งที่คุณกำลังมองหาใช่ไหม?
ทางออกที่ง่ายที่หลีกเลี่ยงการแยกวิเคราะห์ lsและยังใช้งานได้กับช่องว่าง:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf
อยู่ในระบบได้โดยไม่ต้อง
shuf
ไม่ได้กล่าวถึงในคำถาม คำตอบนี้จะยังคงเป็นประโยชน์กับผู้ใช้รายอื่น
Oneliner ไม่มีอะไรนอกจาก Zsh:
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
โปรดทราบว่าไม่มีรุ่นใดที่จะนำมาพิจารณาซ้ำ