Có cách nào để liệt kê một tập hợp nói, 30 tệp ngẫu nhiên từ một thư mục sử dụng các lệnh Linux tiêu chuẩn không? (trong zsh
)
Câu trả lời hàng đầu được mô tả ở đây không hoạt động đối với tôi ( sort
không nhận ra tùy chọn -R
)
Có cách nào để liệt kê một tập hợp nói, 30 tệp ngẫu nhiên từ một thư mục sử dụng các lệnh Linux tiêu chuẩn không? (trong zsh
)
Câu trả lời hàng đầu được mô tả ở đây không hoạt động đối với tôi ( sort
không nhận ra tùy chọn -R
)
Câu trả lời:
Vì bạn đang đề cập đến zsh:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
Bạn có thể thay thế print
bằng nói ogg123
và *
bằng nói**/*.ogg
Hãy thử đường ống ls
đầu ra shuf
, vd
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
Các -n
cờ xác định có bao nhiêu tập tin ngẫu nhiên mà bạn muốn.
command not found
(chưa cài đặt): /
ls
.
Thật dễ dàng để giải quyết điều này với một chút Perl. Chọn ngẫu nhiên bốn tệp từ thư mục hiện tại:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
Mặc dù để sử dụng sản xuất, tôi sẽ sử dụng tập lệnh mở rộng không dựa vào ls
đầu ra, có thể chấp nhận bất kỳ thư mục nào, kiểm tra đối số của bạn, v.v ... Lưu ý rằng bản thân lựa chọn ngẫu nhiên vẫn chỉ là một vài dòng.
#!/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
) là không đủ cho OP. Đối với những gì là và không phải là tiêu chuẩn Unix - Perl tồn tại ở mọi nơi và nó giải quyết vấn đề ngắn gọn và mạnh mẽ. Nếu tôi đưa ra đây là một lớp lót Perl, liệu nó có được tính là 'dòng lệnh' không? Có phải thực tế Perl mạnh mẽ thực sự là một lập luận chống lại sự tồn tại của câu trả lời này?
perl -MList::Util=shuffle -e 'print shuffle(
ls )' | head -n 4
Đây có giống với những gì bạn đang tìm kiếm không?
Một giải pháp đơn giản giúp tránh phân tích ls và cũng hoạt động với khoảng trắng:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf
.
shuf
không được đề cập trong câu hỏi. Câu trả lời này vẫn sẽ hữu ích cho những người dùng khác.
Một oneliner không sử dụng gì ngoài Zsh:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
Tương tự trong Bash, nơi các chỉ số mảng dựa trên zero:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
Lưu ý rằng không có phiên bản nào có bản sao vào tài khoản.