표준 Linux 명령을 사용하여 디렉토리에서 30 개의 임의 파일 세트를 나열하는 방법이 있습니까? (에서 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
플래그는 당신이 원하는 얼마나 많은 임의의 파일을 지정합니다.
답변
작은 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";
}
답변
답변
Zsh 이외의 것을 사용하는 oneliner :
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
배열 인덱스가 0부터 시작하는 Bash와 동일합니다.
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
두 버전 모두 중복을 고려하지 않습니다.