ফাইলগুলিকে সংখ্যা অনুসারে বাছাই করা তালিকাবদ্ধ করুন


122

আমি থেকে ফাইল একটি গুচ্ছ আছে log1করার log164

আমি ইউনিক্স টার্মিনালে ডিরেক্টরিটি বাছাই করার চেষ্টা করছি (বাছাই করা) তবে বাছাই করা ফাংশনগুলি কেবল এই জাতীয় বিন্যাস সরবরাহ করে:

home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc

আমি যা চাই তা হ'ল

home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc

আমি এটি করতে কী ব্যবহার করতে পারি তার কোনও পরামর্শ?


8
এটি একেবারে একটি প্রোগ্রামিং প্রশ্ন, এবং উত্তর হ'ল শেল প্রোগ্রামিং ভাষা জড়িত বলেই স্থানান্তরিত হওয়ার যোগ্য নয় !!!
tchrist

আপনি আগাম জানবেন, তারা নামে থাকেন log1.gzমাধ্যমে log164.gz, তারপর কি আপনি এমনকি করতে হবে ls -1তাদের জন্য?
রুখ

1
@ruakh ls -1 এর পরিবর্তে তারপরে একটি কলামে ফলাফলগুলি প্রদর্শন করবে

3
@ রাবিয়ানী: আমি জানি কী ls -1করে: এটি ফাইলের নাম তালিকাভুক্ত করে। যেহেতু আপনি ইতিমধ্যে ফাইলের নামগুলি জানতেন তাই আপনার কী প্রয়োজন তা আমি বুঝতে পারি নি। কিন্তু যেহেতু আপনি কেভিন এর উত্তর স্বীকার করেছেন, আমি এখন জানি: আপনি করা হয়নি এটি প্রয়োজন। যা আরও বোধগম্য হয়। :-)
রুখ

উত্তর:


40

bashএর ধনুর্বন্ধনী, {}তাদের ক্রমাগত অঙ্ক করবে:

for file in log{1..164}.gz; do
    process "$file"
done

266

lsএই বিশেষ ক্ষেত্রে যেমন অন্তর্নির্মিত বৈশিষ্ট্যটি ব্যবহার করবেন না

-v natural sort of (version) numbers within text

উদাহরণ স্বরূপ ls -1v log*


দুর্দান্ত সমাধান, যদিও আমি চাইছি একটি সমান সরল সমাধান ব্যবহার করে sort, যদি ফাইলের ডিরেক্টরি পরিবর্তে স্ট্রিংয়ের অ্যারে থাকে তবে
হুব্রো

23
উপর বাসদ / ওএসএক্স এই অপশনটি অন্য কিছু হল: -v - Force unedited printing of non-graphic characters
কেনারব

দুর্ভাগ্যক্রমে -v বিকল্পটি
এআইএক্স

6
এটি সেরা উত্তর হওয়া উচিত।
32r34wgf3e

1
ম্যাকোএসের জন্য এটি কাজ করবে, উল্লিখিত হিসাবে কোনও বিকল্প খুঁজে পেল নাls | sort -n
রিকি লেভি

47

জিএনইউ এলএস সহ (যেমন লিনাক্স, সাইগউইন বা অন্যান্য সিস্টেমে বিশেষত জিএনইউ এলএস ইনস্টল করা আছে):

ls -v

জেডএসে:

echo *(n)

অন্যান্য শেলগুলিতে:

echo log?.gz log??.gz log???.gz

প্রতিস্থাপন echoদ্বারা printf '%s\n'যদি আপনি একটি পৃথক লাইন প্রতিটি ফাইলের নাম চাই।

আপনি যদি ফাইল মেটাটাটাও ( ls -l) চান এবং আপনার জিএনইউ না থাকে তবে আপনার lsপ্রতিটি ফাইলের নাম বা ফাইল নামগুলির গ্রুপের জন্য আলাদাভাবে কল করতে হবে যা আপনি অভিধান হিসাবে দেখতে চান।

ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz

এই সমস্যাগুলি এড়াতে, আপনার ফাইলের নামগুলিতে পর্যাপ্ত নেতৃস্থানীয় শূন্যগুলি ব্যবহার করুন যাতে অভিধানিক ক্রমটি মানব-বান্ধব ( log001.gzইত্যাদি)।


29

যদিও সমাধানটি ls -1vএই নির্দিষ্ট ক্ষেত্রে অবশ্যই সর্বোত্তম, তবে আমি মনে করি যে sortমূল প্রশ্নের মতো এটির সাথে কাজ করাও ভাল কারণ আপনার ইনপুটটি না এলে এটিও কাজ করে ls। এই ক্ষেত্রে আপনি ব্যবহার করতে পারেন:

ls -1 | sort -n -k1.4

-nবিকল্প সাজানোর বলে সংখ্যাসূচকভাবে বাছাই করতে, এবং -k 1.4প্রথম মাঠে সাজানোর কী (যা এই ক্ষেত্রে পুরো ফাইলের নাম হয়) গত পর্যন্ত 4 র্থ চরিত্র থেকে শুরু সেট করে।


আমার ক্ষেত্রে, ls -1 | sort -n -k1.4কাজ করে না। এটি প্রথমে চারটি অক্ষর ছাড়াই চতুর্থ অক্ষরের পরে বাছাই করে দেয়। আমি ls -1 |sort | sort -n -k1.4পরিবর্তে ব্যবহার করেছি এবং এটি পুরোপুরি কাজ করেছে worked
প্রভু

3
@ প্রভূ, পরিবর্তে, আপনি করতে পারেন sort -k1.1,1.3 -k1.4nsortবাস্তবায়নগুলি স্থিতিশীল হওয়ার প্রয়োজন হয় না তাই আপনার পদ্ধতির সমস্ত প্রয়োগের সাথে কাজ করে না। -Vজিএনইউ এবং ফ্রিবিএসডি বিকল্পটিও দেখুন sort
স্টাফেন চেজেলাস

21

জিএনইউ sort(লিনাক্সে উপলভ্য,) এর একটি "সংস্করণ সাজানো" মোড রয়েছে যা আপনি যেভাবে জিজ্ঞাসা করছেন ঠিক সেইভাবে নন-সংখ্যাগুলির মধ্যে সংখ্যাগুলি ব্যাখ্যা করে:

থেকে man 1 sort:

    -V, --version-sort
           natural sort of (version) numbers within text

(তালিকায় ফাঁকা পরীক্ষার ফাইল তৈরি করা হচ্ছে
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz:)

আপনার উদাহরণের ক্ষেত্রে -Vবিকল্পটি (বা --version-sort) যুক্ত করুন:

ls -1 log*.gz | sort -V
log1.gz
log2.gz
log3.gz
log99.gz
log100.gz
log101.gz
log102.gz


3

সোলারিসের আমার সংস্করণ ls -v(grrr) সমর্থন করে না । 1 এর উপরে প্রদত্ত বাছাই করা সমাধানের জন্য ফাইলনামে অঙ্কগুলির অবস্থানের জ্ঞান প্রয়োজন এবং 2) মাল্টি-পার্ট সংস্করণ সংখ্যার মতো জিনিসগুলি পরিচালনা করে না।

নীচের পদ্ধতিটি সোলারিস-সামঞ্জস্যপূর্ণ, অঙ্কের অবস্থানগুলি সম্পর্কে পূর্বসূচী প্রয়োজন হয় না এবং 2, 3 বা 4 উপাদান (যেমন: a-1.2, foo-5.6.7, বার_বাজ_9.10.11.12) সহ সংস্করণ সংখ্যাগুলি পরিচালনা করে। এটি sort -fউপরের এবং ছোট হাতগুলি একসাথে ভাঁজ করার জন্য এবং ফাইলগুলির সাথে অন্তর্নির্মিত ডিরেক্টরিগুলি সঠিকভাবে পরিচালনা করে:

ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n

নোট করুন যে এই সংস্করণটি প্রথম উপাদানটিকে একক অঙ্কের মধ্যে সীমাবদ্ধ করে।

যদি আপনার টার্গেট অপারেটিং সিস্টেম (গুলি) সমর্থন ls -vকরে তবে এটি পরিষ্কারভাবে উচ্চতর সমাধান।




0

এটি আমার পক্ষে কাজ করেছে।

আমার কাছে 1.jpg 2.jpg ফাইল রয়েছে ... 18.jpg

$ echo *.jpg | tr -s ' ' '\n' | sort -n

sortlsছাপছাড়া রঙের অক্ষরের কারণে আউটপুট নিয়ে বিভ্রান্ত হচ্ছে । আপনি যদি এটি চেষ্টা করেন:

ls -1 --color=none *.jpg | sort -n

এটি পুরোপুরি কাজ করবে।

sortঅপ্রিন্টযোগ্য অক্ষরগুলি -iবিকল্প সহ উপেক্ষা করতে পারে তবে এটি এখনও কার্যকর হয় না এবং কেন তা আমি জানি না।

তবে আপনি সর্বদা এর মতো রঙ ফেলাতে পারেন এবং sortকাজ করবে:

ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n

আমি আশা করি একদিন এর sortজন্য একটি বিকল্প থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.