有没有一种方法可以使用标准Linux命令从目录中列出一组30个随机文件?(在中zsh
)
这里描述的最佳答案对我sort
不起作用(无法识别该选项-R
)
我很好奇您使用的是什么操作系统。
—
ixtmixilix 2012年
有没有一种方法可以使用标准Linux命令从目录中列出一组30个随机文件?(在中zsh
)
这里描述的最佳答案对我sort
不起作用(无法识别该选项-R
)
Answers:
由于您提到的是zsh:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
您可以print
用say ogg123
和*
say 代替**/*.ogg
command not found
(未安装):/
ls
。
只需一点点Perl即可解决此问题。从当前目录中随机选择四个文件:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
不过,对于生产用途,我将使用不依赖于ls
输出,可以接受任何目录,检查您的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,什么不是标准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
请注意,两个版本都不考虑重复项。