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])
print
Söyle ogg123
ve *
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
-n
Bayrak 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 4
Bu 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
.
shuf
sö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.