작은 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";
}