Standart Linux komutlarını kullanarak bir dizinden bir dizi 30 rasgele dosyayı listelemenin bir yolu var mı? (inç zsh)
Burada açıklanan üst yanıt benim için sortçalışmıyor ( seçeneği tanımıyor -R)
Standart Linux komutlarını kullanarak bir dizinden bir dizi 30 rasgele dosyayı listelemenin bir yolu var mı? (inç zsh)
Burada açıklanan üst yanıt benim için sortçalışmıyor ( seçeneği tanımıyor -R)
Yanıtlar:
Zsh'den bahsettiğiniz için:
rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])
printSöyle ogg123ve *söyle ile değiştirebilirsiniz**/*.ogg
Boru dene lsçıktı shuf, örneğin
$ touch 1 2 3 4 5 6 7 8 9 0
$ ls | shuf -n 5
5
9
0
8
1
-nBayrak kaç istediğiniz rasgele dosyaları belirtir.
command not found(kurulu değil): /
ls .
Bunu birazcık Perl ile çözmek oldukça kolaydır. Geçerli dizinden rastgele dört dosya seçin:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
Üretim kullanımı için olsa da, lsçıktıya güvenmeyen, herhangi bir dizini kabul edebilen, argümanlarınızı kontrol edebilen, genişletilmiş bir komut dosyası ile giderdim . Rastgele seçimin kendisinin hala sadece birkaç satır olduğunu unutmayın.
#!/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 için yeterli değildi. Standart olan ve olmayan olana gelince, Unix - Perl her yerde var olur ve sorunu özlü ve sağlam bir şekilde çözer. Bunu Perl tek katlı olarak verirsem, bu 'komut satırı' olarak sayılır mı? Perl'in güçlü olması gerçekten bu cevabın varlığına karşı bir argüman mı?
perl -MList::Util=shuffle -e 'print shuffle(ls )' | head -n 4Bu aradığınız gibi mi?
Ls ayrıştırmasını önleyen ve boşluklarla çalışan basit bir çözüm :
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf.
shufsöz konusu değildir. Bu cevap diğer kullanıcılara da yardımcı olacaktır.
Zsh dışında hiçbir şey kullanmayan bir oneliner:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
Dizi indekslerinin sıfır tabanlı olduğu Bash için de aynı şey geçerlidir:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
Her iki sürümün de kopyaları dikkate almadığını unutmayın.