Folder ls` কমান্ড থেকে ফোল্ডার উপসর্গটি মুছে ফেলা কি সম্ভব?


12

আমি বাশ স্ক্রিপ্টে আছি এবং আমি সমস্ত ফাইলের তালিকা পেতে চাই (সমস্ত জার ফাইল বলতে দিন)। আমি কমান্ডটি কার্যকর করি ls -1 lib/*.jarএবং আমি আউটপুট পাই:

lib/mylib_1.jar
lib/mylib_2.jar
...

নিম্নলিখিত আউটপুট পাওয়ার জন্য কোনও বিকল্প আছে:

mylib_1.jar
mylib_2.jar
...

cd libলুপের মধ্যে থাকায় আগে তৈরি করা কোনও বিকল্প নয় এবং লুপের ভিতরে আমি যে ক্রিয়াগুলি করতে চাই তার জন্য প্যারেন্ট ফোল্ডারে থাকা দরকার।

আমি টাইপ করে তথ্য সন্ধান করার চেষ্টা করেছি man lsকিন্তু আমি কোন সমাধান পাইনি।

অন্য কমান্ডের সাথে সমাধানটি ততক্ষণ ভাল হবে যতক্ষণ না আমি এটিকে আমার lsকমান্ড বা স্বয়ংসম্পূর্ণ পর্যায়ে পাইপ করতে পারি ।


এই ফাইলগুলির নাম দিয়ে আপনি কী করছেন? আপনি কি কেবল সেগুলি টার্মিনালে তালিকাভুক্ত করছেন, বা আপনি তাদের অন্য কোনও প্রোগ্রাম বা স্ক্রিপ্টে (স্বতন্ত্রভাবে বা একটি তালিকা হিসাবে) পাস করছেন? এটি পরিচালনা করার সঠিক উপায়টি কীভাবে ফাইলের নাম ব্যবহার করা হয় তার উপর নির্ভর করে।
কুসালানন্দ

ধারণাটি ছিল একটি মাল্টি-মডিউল জাভা প্রকল্পের তৃতীয় পক্ষের লিবস সম্পর্কে কিছু পরিসংখ্যান করা। আমি কেবল তালিকাটি চেয়েছিলাম এবং এর পরে বাছাই করতে এবং
একীক করুন

উত্তর:


19

Ls পার্সিংয়ের পরিবর্তে আপনার findপরিবর্তে ব্যবহার করা উচিত । তারপরে আপনি basenameপ্রতিটি ফাইলের মধ্যে নেতৃস্থানীয় ডিরেক্টরিগুলি ফ্রি করতে কার্যকর করতে পারেন :

find lib/ -name '*.jar' -exec basename {} \;

ঠিক আছে এই উপায়টি আমার জন্যও উপযুক্ত।
4

3
অপশনটিও দেখুন -maxdepth

13

জিএনইউ দিয়ে প্রতিটি একক ফাইলের জন্য findচালানোর দরকার নেই basename, এটি আরও দ্রুত হবে (বিশেষত যদি প্রচুর ফাইল থাকে):

find lib -name '*.jar' -printf '%P\n'

11

কীভাবে (cd lib && echo *.jar), ধরে নিচ্ছেন যে ফাইলের নামগুলিতে আপনার কাছে সাদা জায়গা বা বিশেষ অক্ষর নেই। মূল স্ক্রিপ্ট কখনই ডিরেক্টরি পরিবর্তন করে না।


স্পেসগুলিও কোনও সমস্যা হবে না।
টেরডন

এটি একটি ভাল ধারণা এবং সম্ভবত দ্রুততম বিকল্প হবে। আমি printf '%s\n' *.jarপ্রতিটি ফাইল একটি ভিন্ন লাইনে পেতে চাই।
গ্রামীণ

অথবা এমনকি printf '%s\0' *.jarশ্বেতস্পেসের সমস্যাগুলি দূর করতে (যদিও এটি Q নয়)
গ্রিম

5

জোশ জলি যেমন তার উত্তরে বলেছিলেন, আপনার কখনই বিশ্লেষণ করা উচিত নয় ls, পরিবর্তে তার উত্তরে পদ্ধতির ব্যবহার করুন। তবুও, awkফাইলের নামগুলি থেকে পাথগুলি সরিয়ে দেওয়ার একটি সমাধান এখানে রয়েছে , কেবলমাত্র এটি ls দিয়ে ব্যবহার করবেন না:

find . | awk -F'/' '{print $NF}'

-F'/'সেট ক্ষেত্র বিভাজক থেকে /যার মানে গত ক্ষেত্র, $NF, ফাইল নাম হবে।


1

findসম্ভবত এটি যাওয়ার উপায়, তবে আপনি যদি সত্যিই সত্যিই করেন (আপনি না) lib/থেকে সরে যেতে চান ls -1, আপনি এটি ব্যবহার করতে পারেন sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

আপনি এই ব্যবহার করতে পারেন xargs একটি --max-args সঙ্গে (বা খাটো ওরফে -n) পরামিতি:

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

নোট করুন যে আমরা --quoting-style=cফাইলনামগুলিতে শূন্যস্থানগুলি xargs স্ক্রু আপ না করে তা নিশ্চিত করতে ব্যবহার করি।


আমি তা খেয়াল করিনি। ধন্যবাদ! অন্য স্ট্যাক এক্সচেঞ্জে এই রত্নটি পাওয়া গেছে। আপনি - কোটিং-স্টাইল = সি দিয়ে ls ফলাফলের উদ্ধৃতিগুলি প্রবর্তন করতে পারেন। সুতরাং ফলাফলের সম্পূর্ণ কমান্ডটি হ'ল: s ls --quoting-style = c -1 lib / *। জার | xargs --max-args 1 বেসনেম`
yoni

-1

আপনার প্রশ্নের সমাধানের বিকল্প উপায় হ'ল ব্যবহার করে সমস্ত ফাইল তালিকাভুক্ত করা ls -R। Ls কমান্ডের আউটপুটটিকে গ্রেপ দিয়ে কেবল .jar ফাইলের তালিকাতে একত্রিত করুন। আপনার প্রশ্নের জন্য একই কাজ করতে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

ls -R lib | grep jar| grep -v jar*

এটি খুব খারাপভাবে ব্যর্থ হবে যদি সেখানে একটি সাব-ডাইরেক্টরিতে জার ফাইলগুলিও থাকে বা উদাহরণস্বরূপ "list-of-jars.txt" নামের একটি ফাইল থাকে।
জুলাই

গ্রেপ-ভি জার * আপনার উদ্ধৃত উদাহরণের মতো ফাইলযুক্ত ফলাফলগুলি ফিল্টার করে ফেলবে।
joshi.mohit86

সত্য। এটি সমস্ত উদ্দেশ্যে করা ফাইলগুলি ফিল্টার করে দেবে। এখন আমি এটি আবারও দেখছি, আমি এমন কোনও পরিস্থিতি দেখতে পাচ্ছি না যেখানে আপনার প্রস্তাবিত আদেশটি আসলে কোনও আউটপুট তৈরি করতে পারে ...
জুলাই

না, এটি এর মতো ফাইলগুলি প্রদর্শন করবে mylib_2.jarএবং এর মতো ফাইলগুলি ফিল্টার করবে list-of-jars.txt
joshi.mohit86

না, তা হয় না। আমি এটি চেষ্টা করেছিলাম। find development -name '*.jar' | wc -l-> 70ls -R development | grep jar| grep -v jar*-> মোটেও আউটপুট নেই।
জুলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.