স্ট্যান্ডার্ড লিনাক্স কমান্ড ব্যবহার করে ডিরেক্টরি থেকে 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আউটপুট নির্ভর করে না , যে কোনও দির গ্রহণ করতে পারে, আপনার আরগগুলি চেক করতে পারে ইত্যাদি etc. নোট করুন যে এলোমেলো নির্বাচন নিজেই এখনও কেবল কয়েক লাইন is
#!/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চেয়ে বেশি কি আপনি যা খুঁজছিলেন?
একটি সাধারণ সমাধান যা ls কে পার্সিং এড়ানো এবং স্পেসগুলির সাথেও কাজ করে:
shuf -en 30 dir/* | while read file; do
echo $file
done
shuf।
shufপ্রশ্নে উল্লেখ করা হয়নি। এই উত্তরটি এখনও অন্য ব্যবহারকারীদের জন্য সহায়ক হবে।
অনলাইনার Zsh ব্যতীত আর কিছুই ব্যবহার করছে না:
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
নোট করুন যে কোনও সংস্করণই সদৃশটিকে অ্যাকাউন্টে নেয় না।