ডিরেক্টরি থেকে এক্স র্যান্ডম ফাইলগুলি তালিকাভুক্ত করুন


14

স্ট্যান্ডার্ড লিনাক্স কমান্ড ব্যবহার করে ডিরেক্টরি থেকে 30 টি এলোমেলো ফাইল বলার একটি সেট আছে কি? (ইন zsh)

এখানে বর্ণিত শীর্ষের উত্তরটি আমার পক্ষে কাজ sortকরে না ( বিকল্পটি স্বীকৃতি দেয় না -R)


আপনি কি ওএসে আছেন তা আমি আগ্রহী।
ixtmixilix

উত্তর:


7

যেহেতু আপনি zsh উল্লেখ করছেন:

rand() REPLY=$RANDOM
print -rl -- *(o+rand[1,30])

আপনি প্রতিস্থাপন করতে পারেন printবলতে সঙ্গে ogg123এবং *বলতে সঙ্গে**/*.ogg


19

যেমন 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(ইনস্টল করা হয়নি): /
এমিলিও ওয়াজকেজ-রেইনা

অদ্ভুত ... এটি কোর্টিলগুলির একটি অংশ হওয়া উচিত। যদি আপনার কোর্টিলগুলি পুরানো হয় তবে কমান্ডটি সেখানে থাকবে না।
রেনান

6
এটি দ্রুত এবং নোংরা উপায়, এবং আমি এটিও ব্যবহার করব - এক-অফ স্ক্রিপ্টের জন্য। আরও টেকসই যে কোনও কিছুর জন্য আউটপুটকে বিশ্লেষণ করা এড়িয়ে চলুনls
janmoesen

@janmoesen এই সম্পর্কে আমি জানতাম না। ধন্যবাদ!
রেনান

@ রেনান প্রতিটি ইউনিক্সে জিএনইউ কোর্টিলগুলি ডিফল্টরূপে ইনস্টল থাকে না।
কুসালানন্দ

2

পার্লের ক্ষুদ্র বিট দিয়ে এটি সমাধান করা বেশ সহজ। বর্তমান ডিরেক্টরি থেকে এলোমেলোভাবে চারটি ফাইল নির্বাচন করুন:

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";
}

ইমো পার্ল স্ক্রিপ্ট কোনও 'স্ট্যান্ডার্ড ইউনিক্স কমান্ড' নয়। এই সমস্যাটি পার্ল, পাইথন বা রুবির মতো কোনও উচ্চ-স্তরের স্ক্রিপ্টিং ভাষায় সমাধান করা সহজ তবে সরাসরি কমান্ডলাইনে থাকলে আরও আকর্ষণীয় interesting
অঙ্কিত

1
@gerrit - আমি আপনার বক্তব্য গ্রহণ করি আমি এটি সরবরাহ করেছি কারণ পছন্দসই উত্তর (ব্যবহার করা shuf) ওপি-র পক্ষে যথেষ্ট ছিল না। স্ট্যান্ডার্ড ইউনিক্স কী এবং কী নয় - পার্ল সর্বত্রই বিদ্যমান এবং এটি সমস্যাটিকে সংক্ষিপ্তভাবে এবং দৃ .়তার সাথে সমাধান করে। যদি আমি এটি পার্ল ওয়ান-লাইনার হিসাবে দিতাম তবে তা কি 'কমান্ড লাইন' হিসাবে গণ্য হত? পার্ল কি সত্যই শক্তিশালী এই উত্তরটির অস্তিত্বের বিরুদ্ধে যুক্তি?
ire_and_curses

আমি বলব এটি একটি ভিন্ন প্রশ্নের উত্তর। অবশ্যই কোনও সম্পূর্ণ বৈশিষ্ট্যযুক্ত প্রোগ্রামিং ভাষায় এই সমস্যাটি তুচ্ছ, আমার কাছে প্রশ্নের আকর্ষণীয় অংশটি যদি এটি করা যায় / without 20 এলওসি স্ক্রিপ্টটি অবলম্বন না করে / করা যায়; স্ক্রিপ্টিং ভাষাগুলি শক্তিশালী, তবে আমি মনে করি না পার্ল একটি কমান্ড হিসাবে শ্রেণিবদ্ধ করেছে (যেমন ওপি চাইছিল; এবং না, যদি আপনি পার্লকে অনুরোধ করার জন্য একটি 200-চরিত্রের কমান্ডলাইন দিতেন তবে আমি একই মতামত জানতাম)।
অঙ্কিত

@gerrit - সম্ভবত আমি আরও পরিষ্কার হতে পারি। আমার সম্পাদনাটি একবার দেখুন: perl -MList::Util=shuffle -e 'print shuffle(ls এর )' | head -n 4চেয়ে বেশি কি আপনি যা খুঁজছিলেন?
ire_and_curses

হ্যাঁ, আমি আমার ডাউনভোটটি সরিয়েছি যা স্বীকার করেছেন যে কিছুটা কঠোর ছিল।
অঙ্কুর

1

একটি সাধারণ সমাধান যা ls কে পার্সিং এড়ানো এবং স্পেসগুলির সাথেও কাজ করে:

shuf -en 30 dir/* | while read file; do
    echo $file
done

অন্যান্য মন্তব্যে যেমন দেখা যায়, ওপি ব্যতীত কোনও সিস্টেমে রয়েছে shuf
কুসালানন্দ

এড়ানোর shufপ্রশ্নে উল্লেখ করা হয়নি। এই উত্তরটি এখনও অন্য ব্যবহারকারীদের জন্য সহায়ক হবে।
স্কাই

0

অনলাইনার 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

নোট করুন যে কোনও সংস্করণই সদৃশটিকে অ্যাকাউন্টে নেয় না।


1
এটি একই ফাইলটিকে একাধিকবার তালিকাবদ্ধ করতে পারে। এটি এড়ানো সমস্যার একটি উল্লেখযোগ্য অংশ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

গিলস: একদম ঠিক আছে, এ কারণেই আমি বলেছিলাম "নোট করুন যে কোনও সংস্করণই নকলকে আমলে নেয় না।" আপনি যদি এখনও সময়ের জটিলতার বিষয়ে চিন্তা না করেন এবং প্রতিবার এলোমেলো একটিটিকে সরিয়ে ফেলেন তবে আপনি খাঁটি বাশে এটি এখনও করতে পারেন। এমনকি ওয়ান-লাইনারের কাছাকাছিও নয়, তবে অবশ্যই এটির প্রয়োজন ছিল না।
janmoesen
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.