क्या मानक लिनक्स कमांड्स का उपयोग करके निर्देशिका से 30 यादृच्छिक फ़ाइलों को कहने का एक सेट सूचीबद्ध करने का एक तरीका है? (इन zsh
)
यहाँ वर्णित शीर्ष उत्तर मेरे लिए काम नहीं करता है ( sort
विकल्प को नहीं पहचानता है -R
)
क्या मानक लिनक्स कमांड्स का उपयोग करके निर्देशिका से 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
ध्वज को निर्दिष्ट करता है कि आप कितने यादृच्छिक फ़ाइलें चाहते हैं।
command not found
(स्थापित नहीं): /
ls
।
एक छोटे से पर्ल के साथ इसे हल करना काफी आसान है। वर्तमान निर्देशिका से यादृच्छिक पर चार फ़ाइलों का चयन करें:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)' | head -n 4
हालांकि उत्पादन के उपयोग के लिए, मैं एक विस्तारित स्क्रिप्ट के साथ जाऊंगा, जो ls
आउटपुट पर निर्भर नहीं करता है , किसी भी dir को स्वीकार कर सकता है, आपके आर्ग की जांच कर सकता है, आदि ध्यान दें कि यादृच्छिक चयन स्वयं अभी भी केवल कुछ पंक्तियों का है।
#!/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
) ओपी के लिए पर्याप्त नहीं था। के रूप में क्या है और मानक यूनिक्स नहीं है - पर्ल हर जगह मौजूद है, और यह समस्या को सफलतापूर्वक और मजबूती से हल करता है। अगर मैं इसे पर्ल वन-लाइनर के रूप में देता, तो क्या इसे 'कमांड लाइन' के रूप में गिना जाता? क्या वास्तव में पर्ल शक्तिशाली है, इस उत्तर के अस्तित्व के खिलाफ एक तर्क है?
perl -MList::Util=shuffle -e 'print shuffle(
ls )' | head -n 4
क्या यह अधिक पसंद है जो आप देख रहे थे?
एक सरल समाधान जो एलएस के पार्सिंग से बचा जाता है और रिक्त स्थान के साथ भी काम करता है:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf
।
shuf
प्रश्न में उल्लेख नहीं है। यह उत्तर अभी भी अन्य उपयोगकर्ताओं के लिए उपयोगी होगा।
Zsh के अलावा और कुछ नहीं का उपयोग कर एक oneliner:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]} + 1)); echo "${files[i]}"; done
बाश में वही, जहाँ सरणी सूचक शून्य-आधारित हैं:
files=(*); for x in {1..30}; do i=$((RANDOM % ${#files[@]})); echo "${files[i]}"; done
ध्यान दें कि न तो संस्करण डुप्लिकेट को ध्यान में रखता है।