বাশ: ls * ফোল্ডার গ্রুপিং ছাড়াই


12

যদি আমি টাইপ করি:

ls source/*

source/fonts:
fontello

source/images:
bg1.png                eng.png        fra.png   

আমি ফোল্ডারের নাম দ্বারা গোষ্ঠীভুক্ত ফাইলগুলির তালিকা পাই। আমি কীভাবে ফাইলের নামের তালিকা পেতে পারি?

ls source/*

source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png   

ধন্যবাদ


এটি যদি স্ক্রিপ্টিং ব্যবহারের জন্য হয়, আপনি মাইকিউইউউইউজিইউআর.ইউজি.আর / পার্সিংএল দেখতে চাইতে পারেন । (এটি বলেছিল, findভুল ব্যবহারের উপায়ও রয়েছে ; বিশেষত, আপনি যদি চালাচ্ছেন তবে আপনি for file in $(find ...)তাদের একটিকে আঘাত করেছেন)।
চার্লস ডাফি

উত্তর:


13

আউটপুট পরিবর্তন ব্যতীত সম্ভব বলে মনে হয় না, তবে এখানে একটি সহজ বিকল্প উপায়:

find source/ -type f

অথবা (জিএনইউ সন্ধানের জন্য সুনির্দিষ্ট), কেবল আপনার প্রশ্নের গভীরতায় ফাইলগুলি পেতে:

find source/ -type f -mindepth 2 -maxdepth 2

(অথবা আপনি যদি ডিরেক্টরিগুলি চান lsযা চান তবে সরান -type f)


5

আপনি কিছু সাইকেডলিকস যুক্ত করলে আপনি কেবলমাত্র ls তে লেগে থাকতে পারেন ( ls -d):

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

@ চথুলহু ঠিক আছে আমার উদাহরণটি খুব ছোট আমি আসলে খুঁজে পেতে পছন্দ করি না এবং আপনি
এলএস

গভীরতা সীমাবদ্ধ করতে আমি অন্য উত্তরে একটি সম্পাদনার পরামর্শ দিয়েছি।
o11c

@ o11c খুব ভাল তবে findএটি একটি চর্বিযুক্ত জন্তু।
ইকরাব

3

আপনি "দরিদ্র লোক find" এর প্রতি আগ্রহী হতে পারেন :

shopt -s globstar

shopt -s গুলি নামযুক্ত শেল বিকল্প (গুলি) এটস করে। globstarবিকল্প অনুসরণ হিসাবে সংজ্ঞায়িত করা হয় ব্যাশ (1) :

যদি সেট করা থাকে তবে **কোনও ফাইল নাম / পথের নাম প্রসারণ প্রসঙ্গে ব্যবহৃত প্যাটার্ন একটি ফাইলের সাথে মিলবে [sic] এবং শূন্য বা আরও ডিরেক্টরি এবং উপ ডিরেক্টরি irect যদি প্যাটার্নটি একটি দ্বারা অনুসরণ করা হয় তবে /কেবল ডিরেক্টরি এবং উপ-ডিরেক্টরি মেলে।

সুতরাং, আপনি কাজটি করার পরে shopt -s globstar, নিম্নলিখিত কমান্ডগুলির মধ্যে একটি:

ls -d1 - উত্স / **                  # 'd' এর পরের অক্ষরটি হ'ল এক অঙ্ক। 
ls -d - উত্স / ** | বিড়াল             # অর্থাত্, এটি যে কোনও কমান্ডে পাইপে লিখবে। 
প্রিন্টফ "% s \ n" উত্স / **

আউটপুট উত্পাদন করবে:

source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png

দুর্ভাগ্যক্রমে, এর মধ্যে ডিরেক্টরিগুলির নামও অন্তর্ভুক্ত রয়েছে। এটি আপনাকে কিছুটা জানতে সাহায্য করতে পারে

printf "%s\n" source/**/

আউটপুট উত্পাদন করবে:

source/
source/fonts
source/images

যেমন, কেবল ডিরেক্টরি নাম names আপনি প্রথম কোনও কমান্ডের আউটপুটটিকে একটি ফাইলে পুনর্নির্দেশ করতে পারেন comm, উপরের আউটপুটটিকে একটি দ্বিতীয় ফাইলে পুনর্নির্দেশ করতে পারেন , diffএবং প্রথমটি থেকে দ্বিতীয় ফাইলটি বিয়োগ করতে কেবল, বা অনুরূপ কিছু ব্যবহার করুন , কেবল প্লেইন রেখে ফাইল (নন ডিরেক্টরি)। তবে তা করবেন না।

আরেকটি পদ্ধতির (যে খুব ভাল না ) হয়

ls -d --file-type -- source/** | grep -v '/$'

--file-typeবিকল্প বলে lsএকটি প্রদর্শন করে / প্রতিটি ডিরেক্টরির নাম (এবং অন্যান্য (বিশেষ প্রান্ত) ফাইল ধরনের অন্য অক্ষর), ভালো শেষে:

উত্স //                             # একটি অতিরিক্ত একটি 
উত্স / ফন্ট /                        # যোগ করা হয়েছে
উৎস / ফন্ট / fontello
উত্স / চিত্র /                       # যোগ করা হয়েছে
উৎস / ছবি / bg1.png
উৎস / ছবি / eng.png
উৎস / ছবি / fra.png

এবং তারপরে grep -v '/$'শেষ হওয়া লাইনগুলি সরিয়ে দেয় /; যেমন, ডিরেক্টরি নাম। দুর্ভাগ্যক্রমে, পসিক্স দ্বারা--file-type বিকল্পটি নির্দিষ্ট করা হয়নি । আপনার সংস্করণ যদি lsএটি সমর্থন না করে তবে ব্যবহার করুন -F। এটি --file-type বাদে এটি *সম্পাদনযোগ্য ফাইলগুলির নামের শেষে একটি প্রদর্শন করে যা কিছু লোক বিরক্তিকর বলে মনে করে। আপনি এগুলি তাদের সাথে মুছে ফেলতে পারেন sed:

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

আপনি যদি সমস্ত ফাইল (এবং কেবলমাত্র ফাইলগুলি) দিয়ে কিছু করতে চান তবে আপনি এটি করতে পারেন

উত্স / ** এফ জন্য
করা
    যদি [-f "$ f"]
    তারপর
        এখানে সরল ফাইলগুলিতে প্রয়োগ করার জন্য কমান্ডগুলি সন্নিবেশ করুন।
    ফাই
সম্পন্ন

মন্তব্য:

  • যখন lsকোনও টার্মিনালে আউটপুট হয় এবং এটি -l( এল ওএনজি) মোডে থাকে না, তখন এটি প্রতি লাইনে একাধিক নাম লেখায় (নামগুলি দীর্ঘ না হলে)। আপনি এটিকে নির্দিষ্ট করে -1(এক) নির্দিষ্ট করে বা একটি ফাইল বা পাইপে আউটপুট পুনর্নির্দেশের মাধ্যমে প্রতি লাইনে একটি নাম লিখতে বাধ্য করতে পারেন ।
  • আপনি সম্ভবত একটি নির্দেশিকা অন্তর্ভুক্ত --করার প্রয়োজন নেই lsযেহেতু আপনি যে ডিরেক্টরিটি তৈরি করেছেন তার তালিকা তৈরি করছেন। *অজানা ডিরেক্টরিতে তালিকাভুক্ত করা ফাইল ফাইলগুলির বিরুদ্ধে সুরক্ষা হিসাবে আপনি এটি ব্যবহার করা উচিত -
  • এর থেকে আউটপুট পার্স করার চেষ্টা করবেন না ls
  • globstarশেল বিকল্প POSIX দ্বারা সংজ্ঞায়িত করা হবে না বলে মনে হচ্ছে। (বাস্তবে, আমি নিশ্চিত নই যে পসিক্স যে কোনও শেল বিকল্পকে স্বীকৃতি দিয়েছে )) এটি একটি bashশখের মতো বলে মনে হচ্ছে , সতর্ক থাকুন - এটি ব্যাশের সমস্ত সংস্করণে উপস্থিত নাও হতে পারে।
  • যদি fontsবা imagesউপ-ডিরেক্টরি থাকে তবে সমস্তগুলি নীচে, **পুনরাবৃত্তির সাথে তালিকাবদ্ধ করবে। গভীরতা সীমাবদ্ধ করার একটি (কিছুটা ক্লেদী এবং অবিশ্বস্ত) উপায়

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    যা তিন বা ততোধিক অক্ষরযুক্ত লাইনগুলি সরিয়ে দেয় /

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