ডিরেক্টরি সহ ডিরেক্টরি নামের একটি তালিকা পান


35

আমি জানি ডিরেক্টরি নামের একটি তালিকা পেতে আমি এটি করতে পারি:

find . -type d -maxdepth 1 

আউটপুটটি দেখতে এটির মতো দেখাচ্ছে:

.
./foo
./bar

আমি তালিকা ছাড়াই পছন্দ করি ./। খালি কাঁচা নামগুলি খুঁজে পাওয়ার কী উপায় আছে?

আমি স্ট্যাটাসে তালিকাটি প্রেরণে পাঠানোর চেষ্টা করেছি তবে এটি আমাকে একই ফলাফল দেয়:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

আপনি সামনে foo bar ...এক লাইনে সব চান ./?
লেভন

এটি কি কেবল প্রসাধনী / নান্দনিক কারণে বা আপনি আউটপুট দিয়ে কিছু করার চেষ্টা করছেন?
jw013

উত্তর:


42

জিএনইউ দিয়ে findআপনি -printfবিকল্পটি ব্যবহার করতে পারেন :

find . -maxdepth 1 -type d -printf '%f\n'

মন্তব্যগুলিতে পাউয়ে দ্বারা উল্লিখিত হিসাবে আপনি যদি বর্তমান ডিরেক্টরিটি তালিকাভুক্ত না করতে চান তবে -mindepth 1উদাহরণস্বরূপ:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'


@ রহমু: এটি জিএনইউ অনুসন্ধানের মাধ্যমে পরীক্ষা করা হয়েছিল। কোনটিই printfঅপশন POSIX উল্লেখ করা হয় এবং তারা অন্যান্য কিছু সমর্থিত হতে বলে মনে হচ্ছে না findসংস্করণের। জিএনইউ অনুসন্ধান বেশিরভাগ জায়গায় ইনস্টল করা যেতে পারে, সুতরাং সেই অর্থে এটি বহনযোগ্য।
থোর

1
এছাড়াও -mindepth 1যদি আপনি পরিত্রাণ পেতে চান তবে যোগ করুন.
পাওয়ে প্র্যাক

18

হালনাগাদ:

একটি সংক্ষিপ্ত বিকল্প:

 find . -maxdepth 1 -type d | cut -c 3-

কোনও রেখা ছাড়াই আপনাকে প্রতি লাইনে একটি করে নাম দেবে


4
@ ডাউনভোটার .. ব্যাখ্যা ছাড়াই একটি ডাউনভোট কাউকে সহায়তা করে না (ওপি, এসও বা আমার)। এটি ওপি-র প্রশ্নের কার্যকরী সমাধান। উত্তরটি নির্দেশিত বা উন্নত করা হলে আমি একটি ত্রুটি সংশোধন করতে পেরে খুশি, তবে এর জন্য কেবল একটি বেনামে "ক্লিক" না করে গঠনমূলক প্রতিক্রিয়া প্রয়োজন ।
লেভন

1
আপনার উত্তরের বিশ্লেষণ অন্তর্ভুক্ত করার সময় আমিই সেই ব্যক্তিকে হ্রাস করেছি ls। একই সাথে আমি অন্য একটি উত্তরে এটি কেন খারাপ ধারণা তা নিয়ে একটি লিঙ্ক পোস্ট করেছি যা পরে মুছে ফেলা হয়েছে। তখন মাত্র 2 টি উত্তর ছিল এবং কারণটি সুস্পষ্ট বলে মনে হয়েছিল। আমি আনন্দিত আপনি অস্পষ্টতা নির্দেশ করেছেন, এবং এখানে আমার ব্যাখ্যা। রেকর্ডের জন্য, আমি আমার উপনোটকে একটি উঁচুতে পরিণত করেছি কারণ আমি আপনার বর্তমান উত্তরের সাথে সম্মত।
রাহমু

@ আরহামু অন্য প্রশ্নে আপনার ডাউনটোটের জন্য ব্যাখ্যা দেওয়া আমার পক্ষে সহায়ক নয় (এবং কেবল আপনার কাছে স্পষ্ট)। এছাড়াও, এটি আরও ভাল সমাধান হওয়ার পরে, আমি যে সমাধানটি পোস্ট করেছি তা ঠিক কাজ করার আগেই (হ্যাঁ, আমি আপনার "এলএস ব্যবহার করবেন না" লিঙ্কটির সাথে পরিচিত - তবে এটি সমস্ত ক্ষেত্রে অন্ধভাবে প্রয়োগ করে না)। আমার প্রাথমিক সমাধানটি কেন কাজ করে না তার জন্য যদি আপনার একটি পাল্টা উদাহরণ থাকে তবে আমি এটি জানতে আগ্রহী (যাতে আমি এটি থেকে আসলে কিছু শিখতে পারি), অন্যথায় আপনি কেবল একটি লিঙ্ক পোস্ট করছেন এবং গঠনমূলক কোনও প্রস্তাব দিচ্ছেন না।
লেভন

আছে একটি বিবেচনা করুন \nএকটি ডিরেক্টরি নামে আপনি এটি পুনরুদ্ধার করতে (যা যখন আমি তোমাদের downvoted তুমি কি করছিলে) কাটা ব্যবহার করা যাবে না। এমন কয়েকটি ক্ষেত্রে রয়েছে যেখানে lsবিপজ্জনক আচরণ করে না এবং এটি অন্যভাবে ব্যবহার করা প্রায় সর্বদা নিরাপদ।
রাহমু

9

জিএনইউ ফাইন্ড ব্যবহার করে আপনি বর্তমান ডিরেক্টরিটি মেলে না থেকে রোধ করতে -মাইন্ডপথ ব্যবহার করতে পারেন:

find . -type d -maxdepth 1 -mindepth 1

যেহেতু আপনি এটি পুনরাবৃত্তভাবে করছেন না তাই আপনি ব্যাশ গ্লোব ব্যবহার করতে পারেন:

echo */

কোনও গ্লোবটিতে একটি ট্রেইলিং / যোগ করার ফলে কেবল ডিরেক্টরিগুলি মেলাতে পারে।


1
*/ডট ফাইলগুলি মিস করে এবং সিমলিংকগুলি অন্তর্ভুক্ত করে। এটি সমস্যা হতে পারে বা নাও হতে পারে।
গিলস 23'18

@ গিলস - এটি সর্বদা সিমলিংকগুলি মিস করবে, তবে ডটফাইলস ডটগ্লোব সেট আছে কি না তার উপর নির্ভর করে।
জর্ডানম

6

sedএই দুটি অক্ষর মুছে ফেলা যাক :

find . -maxdepth 1 -type d | sed -e 's/^\.\///'


2

আমি সাধারণত:

find * -type d

আপনি যা চান তা করার সঠিক উপায় কিনা তা আমি জানি না।


1
আপনি যদি শেলটিকে সমস্ত ফাইলের নাম প্রসারিত করতে চলেছেন তবে কেন এগুলি কেন খুঁজে পাবেন?
জর্ডানম

@ জোর্ডানম কেবল ডিরেক্টরি নির্বাচন করতে। echo */একই জিনিসটি কমবেশি করতে হবে (এটি ডট ফাইলগুলিকে মিস করে এবং এতে সিমলিংক অন্তর্ভুক্ত রয়েছে) তবে জোআচিম কীভাবে চূড়ান্ত অপসারণ করবেন তা জিজ্ঞাসা করবে /
গিলস 'অশুভ হওয়া বন্ধ করুন'

0

এআইএক্স-এ প্যারামিটারটি 'ম্যাক্সডেপথ' কাজ করে না।

সাধারণভাবে এটি আমার পক্ষে কাজ করে:

find ./ -type d | cut -d"/" -f2 | sort -u


0

আপনি যা খুঁজছেন তাকে বলা হয় basename, এটি ইউনিক্স ডিরেক্টরি কাঠামোটিকে উপেক্ষা করে

নীচে উদাহরণ:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

এটি আউটপুট এমনকি দির পথের জন্য বাদ দেয়, cd কমান্ড চালানোর আগে প্রয়োজনীয়তা সরিয়ে দেয়


কিছু অ্যাডিশনাল তথ্য:

আমি আউটপুটটির -execপরিবর্তে |(পাইপ) অন্য কমান্ডটি খুঁজে পেতে আর্গুমেন্ট হিসাবে পাস করব (দ্বিতীয় কমান্ড এড়ানো প্রতিটি আউটপুট লাইনের উপর দিয়ে যেতে হবে, বলেছে যে, আউটপুটের উপর নির্ভর করে এটি স্ক্রিপ্টটির কার্যকারিতা উন্নত করতে পারে)

দ্রষ্টব্য: findবিকল্পগুলি অবস্থানগত নয় (-ম্যাক্সডেপথ এটির আগে নির্দিষ্ট করা পরীক্ষাগুলি এবং তার পরে নির্দিষ্ট করাগুলিকে প্রভাবিত করে)।

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