디렉토리에서 X 랜덤 파일 나열 명령을 사용하여

표준 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";
}


답변

ls의 구문 분석피하고 공백과 함께 작동 하는 간단한 솔루션 :

shuf -en 30 dir/* | while read file; do
    echo $file
done


답변

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

두 버전 모두 중복을 고려하지 않습니다.


답변