সংখ্যার অর্ডার সহ গ্লোব


28

আমার কাছে একটি ডিরেক্টরিতে পিডিএফ ফাইলগুলির এই তালিকা রয়েছে:

c0.pdf   c12.pdf  c15.pdf  c18.pdf  c20.pdf  c4.pdf  c7.pdf
c10.pdf  c13.pdf  c16.pdf  c19.pdf  c2.pdf   c5.pdf  c8.pdf
c11.pdf  c14.pdf  c17.pdf  c1.pdf   c3.pdf   c6.pdf  c9.pdf

আমি এগুলিকে সংখ্যার ক্রমে ভুতের স্ক্রিপ্ট ব্যবহার করে বোঝাতে চাই (এর অনুরূপ):

gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf *.pdf

তবে শেল সম্প্রসারণ আদেশ সংখ্যার প্রাকৃতিক ক্রমটি পুনরায় উত্পাদন করে না বর্ণানুক্রমিক ক্রম:

$ for f in *.pdf; do echo $f; done
c0.pdf
c10.pdf
c11.pdf
c12.pdf
c13.pdf
c14.pdf
c15.pdf
c16.pdf
c17.pdf
c18.pdf
c19.pdf
c1.pdf
c20.pdf
c2.pdf
c3.pdf
c4.pdf
c5.pdf
c6.pdf
c7.pdf
c8.pdf
c9.pdf

আমি কীভাবে প্রসারণে কাঙ্ক্ষিত অর্ডারটি অর্জন করতে পারি (যদি 0ফাইলের নাম্বারে সংখ্যায় ম্যানুয়ালি- প্যাডিং যোগ না করে সম্ভব হয় )?

আমি ব্যবহার করার জন্য পরামর্শ পেয়েছি ls | sort -V, তবে আমি এটি আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে কাজ করতে পারি না।


আপনি সমস্ত ক্ষেত্রে কেবল দুটি অঙ্কের সংখ্যা ব্যবহার করতে পারেন, সুতরাং বর্ণানুক্রমিক ক্রমটি সংখ্যার ক্রমের সাথে মিলবে। যতক্ষণ না আপনি হার্ড জিনিসগুলি করতে চান।
ওয়াইল্ডকার্ড

1
3 ডিজিটের সংখ্যা, কমপক্ষে! Y2K মনে রাখবেন।
ওয়ালটিনেটর

উত্তর:


12

আপনার পরিবেশের উপর নির্ভর করে আপনি ls -vজিএনইউ কোর্টিলগুলি ব্যবহার করতে পারেন , যেমন:

gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
   -sOutputFile=out.pdf $(ls -v)

অথবা আপনি যদি ফ্রিবিএসডি বা ওপেনবিএসডি এর সাম্প্রতিক সংস্করণগুলিতে থাকেন তবে:

gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
   -sOutputFile=out.pdf $(ls | sort -V)

ls -vউইল natural sort of (version) numbers within textযাতে
এটিও

@ সন্দীপ: সত্যই, তবে এটি একটি জিএনইউ কোর্টিলস কেবলমাত্র সমাধান বলে মনে হচ্ছে।
থোর

হ্যাঁ, জিএনইউ নির্দিষ্ট বলে মনে হচ্ছে - pubs.opengroup.org/onlinepubs/9699919799
সন্দীপ

1
@ সন্দীপ: এর -Vবৈশিষ্ট্যটিও পসিক্স sortদ্বারা নির্দিষ্ট করা হয়নি। তবে মনে হয় এটি আরও ছড়িয়ে পড়েছে, উদাহরণস্বরূপ, ফ্রিবিএসডি এবং ওপেনবিএসডি উভয়ই sortএটি সমর্থন করে।
থোর

ওহ ঠিক আছে, আপনি উত্তর দিতে এই বিবরণ যুক্ত করতে পারেন? অনুরূপ সমস্যার সন্ধান করতে গিয়ে আমি এই উত্তরটি দেখতে lsপেয়েছি (সংখ্যায়িক ক্রমে গ্লোব) এবং ব্যবহার দেখে আমি এটির বাছাইয়ের পরিবর্তে নিজেই বিকল্প পেয়েছি কিনা তা পরীক্ষা করে দেখেছি :)
সন্দীপ


12

যদি প্রশ্নে থাকা সমস্ত ফাইলের একই উপসর্গ থাকে (যেমন, সংখ্যার আগে পাঠ্য; এক্ষেত্রে c), আপনি ব্যবহার করতে পারেন

জিএস   … আরগস…   সি? .পিডিএফ সি ?? পিডিএফ

c?.pdfপ্রসারিত হয় c0.pdf c1.pdfc9.pdf।  c??.pdfপ্রসারিত হয় c10.pdf c11.pdfc20.pdf (এবং c99.pdfপ্রযোজ্য হিসাবে আপ )। প্রতিটি কমান্ড-লাইন শব্দের সাথে প্যাথনাম এক্সপেনশন ক্যারেক্টার (গুলি) LC_COLLATEভেরিয়েবল অনুসারে বাছাই করা ফাইল নামগুলির তালিকায় প্রসারিত হয় (সংযুক্ত) , সংলগ্ন ওয়াইল্ডকার্ডগুলির (গ্লোবস) সম্প্রসারণের ফলে প্রাপ্ত ফলাফলগুলি মার্জ করা হয় না; তারা সহজভাবে সংক্ষিপ্ত হয়। (মনে আছে মনে হচ্ছে শেল ম্যান পৃষ্ঠাটি একবার স্পষ্টভাবে এটি জানিয়েছিল, তবে আমি এখন এটি খুঁজে পাচ্ছি না))

অবশ্যই যদি ফাইলগুলি উপরে যেতে পারে তবে আপনার ব্যবহার করা c999.pdfউচিত c?.pdf c??.pdf c???.pdf। স্বীকার করে নিন, আপনার কাছে প্রচুর সংখ্যা থাকলে এটি ক্লান্তিকর হতে পারে। আপনি এটি একটু সংক্ষেপে করতে পারেন; উদাহরণস্বরূপ, পাঁচটি অঙ্কের জন্য (আপনি) ব্যবহার করতে পারেন c?{,?{,?{,?{,?}}}}.pdf। যদি আপনার ফাইলনামগুলির তালিকা অপ্রতুল হয় (উদাহরণস্বরূপ, একটি c0.pdfএবং a আছে c12345.pdf, তবে প্রতিটি সংখ্যার মধ্যে অবশ্যই প্রয়োজন নেই), আপনার সম্ভবত nullglobবিকল্পটি সেট করা উচিত । অন্যথায়, যদি (উদাহরণস্বরূপ) আপনার কাছে দ্বি-সংখ্যার নম্বরযুক্ত কোনও ফাইল না থাকে তবে c??.pdfআপনি আপনার প্রোগ্রামে আক্ষরিক যুক্তিটি পেয়ে যাবেন ।

আপনি একাধিক উপসর্গ (উদাহরণস্বরূপ, যদি , এবং , এক বা দুই ডিজিটের নম্বর সহ), আপনি সুস্পষ্ট, পাশব বল পদ্ধতির ব্যবহার করতে পারেন:a<number>.pdfb<number>.pdf c<number>.pdf

a?.pdf a??.pdf b?.pdf b??.pdf c?.pdf c??.pdf

বা এটি ধসে {a,b,c}?{,?}.pdf


1
এই সর্বোত্তম উত্তর কারণ এটি কুয়াশাচ্ছন্ন ব্যবহারের কোনো দাবি পরলোক হয় ls, stat, বা অন্য কিছু; এবং অনুরোধ হিসাবে বাশ কাজ করে।
কাইল

5

যদি কোনও ফাঁক না থাকে তবে নিম্নলিখিতগুলি সহায়ক প্রমাণ করতে পারে (যদিও স্কেচাই এবং প্রান্ত-কেস এবং সাধারণতার বিষয়ে দৃ rob় নয়) - কেবল একটি ধারণা পেতে:

FILES="c0.pdf"
for i in $(seq 1 20); do FILES="${FILES} c${i}.pdf"; done
gs [...args...] $FILES

যদি হতে পারে ফাঁক, কিছু [ -f c${i}.pdf ]চেক যোগ করা যেতে পারে।

সম্পাদনা করুন তাও দেখতে এই উত্তর , যা আপনি (ব্যাশ ব্যবহার করে) পারে ব্যবহার অনুযায়ী

gs [..args..] c{1..20}.pdf

আপনার শেল ভেরিয়েবল রেফারেন্সগুলি (যেমন, "$FILES"এবং "$i") উদ্ধৃত করা সাধারণত একটি ভাল ধারণা না হয় যদি না আপনি যদি না চান তবে আপনার পক্ষে সঠিক কারণ নেই এবং আপনি অবশ্যই জানেন যে আপনি কী করছেন। (বিপরীতে, ধনুর্বন্ধনী গুরুত্বপূর্ণ হতে পারে, তারা উদ্ধৃতি হিসাবে গুরুত্বপূর্ণ না, সুতরাং, উদাহরণস্বরূপ, "c$i.pdf"যথেষ্ট ভাল।) একটি কমান্ড , যেখানে একটি স্পেস-বিভাজিত ফাইল ফাইল রয়েছে, ভাল কারণ হিসাবে মনে হতে পারে এটি উদ্ধৃতি না করে ব্যবহার করুন (কারণ সেই প্রসঙ্গে কাজ করবে না)। ... (Cont'd)gs  [ …args… ]  $FILES$FILES$FILES"$FILES"
জি-ম্যান বলেছেন 'পুনর্বহাল মনিকা'

(চালিয়ে যাওয়া) ... তবে বাশ / পসিক্স শেলগুলিতে কোনও ভেরিয়েবলের উদ্ধৃতি দিতে ভুলে যাওয়ার সুরক্ষা সম্পর্কিত প্রভাবগুলি দেখুন , বিশেষত, আমার উত্তরটি , কীভাবে ব্যাশে (যেমন, FILES=("c0.pdf")এবং FILES+=("c$i.pdf")) অ্যারে হিসাবে মাল্টি-ওয়ার্ড ভেরিয়েবলগুলি পরিচালনা করতে হবে তার নোটগুলির জন্য ; এছাড়াও এই উত্তরটি , যা আমার প্রস্তাবিত কৌশলটি ব্যবহার করে।
জি-ম্যান বলছেন 'মনিকাকে পুনরায় ইনস্টল করুন'

1

কেবল থোরের উত্তর উদ্ধৃত করা এবং ঠিক করা হচ্ছে ... কখনও পার্স ls!

আপনি sort -V(বাছাই করার জন্য একটি নন-পসিক্স এক্সটেনশন) ব্যবহার করতে পারেন :

printf '%s\0' ./* | sort -zV \
    | xargs -0 gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH \
        -sDEVICE=pdfwrite -sOutputFile=out.pdf

(কিছু কমান্ডের জন্য, সম্ভবত জিএস-এর জন্য একটি কমান্ড এটি আপনার "" / "এর পরিবর্তে " ./ " প্রয়োজন ... যদি একটি কাজ না করে তবে অন্যটি চেষ্টা করুন)


1
না পার্স ম আউটপুট না কারণ ম প্রদর্শন ফাইলের নাম সম্পর্কে newline বিভাজিত একটি ফাইলের নাম যে কোন হিসাবে বৈধ হিসাবে থাকাকালীন সম্পর্কে newline কিন্তু এখানে আপনার সাথে একই জিনিস করছেন statফাইলের নামের শুরু সঙ্গে সমস্যা মত (কিন্তু বিভিন্ন অন্যান্য বিষয় যোগ সঙ্গে -, যদি অত্যধিক ফাইল, সমস্যা statএকটি অ-পোর্টেবল কমান্ড হচ্ছে)। এবং আপনি আইএফএস সামঞ্জস্য না করা বা গ্লোবগুলি অক্ষম না করে স্প্লিট + গ্লোব অপারেটরটি ব্যবহার করার কারণে আপনার কাছে এখনও স্থান বা ট্যাব বা ওয়াইল্ডকার্ড অক্ষরযুক্ত ফাইলের সাথে সমস্যা থাকবে।
স্টাফেন চেজেলাস

গনুহ ব্যবহার করার জন্য sort -Vনির্ভরযোগ্যভাবে, আপনি প্রয়োজন চাই ${(z)"$(printf '%s\0' * | sort -zV)"}মধ্যে zsh(যদিও zshহয়েছে (n)সংখ্যাসূচক সাজানোর জন্য ইতিমধ্যে) অথবা readarray -td '' files < <(printf '%s\0' * | sort -zV)মধ্যে bash4.4+
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস ধন্যবাদ, এবং আপনি ঠিক বলেছেন যে নিউলাইনটি উদ্বেগের কারণ হতে পারে তবে এলএসকে পার্স না করার একমাত্র কারণ এটি নয়। এবং হ্যাঁ আমি অলস ছিলাম এবং যোগ করিনি - হয়। তবে আমার প্রিন্টফ ব্যবহার করা উচিত ... আমি এটি পরিবর্তন করব।
পিটার

জন্য lsএকা (যে -l ছাড়া হয়), ওইগুলো কি অন্যান্য উদ্বেগ ? নোট যা কল করা --কোনও ফাইলের জন্য সহায়তা করবে না -
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলা সংস্করণগুলির মধ্যে অন্যান্য পার্থক্য রয়েছে ... যেমন কিছু মুদ্রণের মতো "টোটাল 0" রয়েছে, এবং সর্বশেষতম এলএস সংস্করণ এমনকি এমন জিনিসগুলির চারপাশে উদ্ধৃতিগুলি আটকে রাখে ... touch \"test\"; ls -1উদাহরণস্বরূপ '"test"'আমার এলএসে শোগুলি । এটি কেবল বিশ্লেষণ করে বোঝানো নয় ... এটি একটি ইউজার ইন্টারফেস, কোনও স্ক্রিপ্টিং কমান্ড নয়।
পিটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.