ডিরেক্টরি সম্পর্কিত "ফলাফল" আউটপুট


34

আমি findসমস্ত ফাইল এবং ডিরেক্টরিগুলি cpioঅপারেশনের জন্য একটি নির্দিষ্ট মূলটিতে পুনরাবৃত্তভাবে তালিকাবদ্ধ করতে ব্যবহার করতে চাই । তবে, আমি চাই না যে রুট ডিরেক্টরিটি নিজেই পাথগুলিতে প্রদর্শিত হবে appear উদাহরণস্বরূপ, আমি বর্তমানে পেয়েছি:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

তবে, আমি পেতে চাই

file1
dir1
dir1/file2

(নোটটি রুটটি আমার পছন্দসই আউটপুটটিতেও নেই, তবে এ থেকে মুক্তি পাওয়া সহজ tail) note

আমি ওএস এক্সে আছি, এবং সম্ভব হলে আমি কোনও অতিরিক্ত সরঞ্জাম (যেমন জিএনইউ সন্ধান) ইনস্টল না করা পছন্দ করি, যেহেতু আমি অন্যান্য ওএস এক্স ব্যবহারকারীদের সাথে যে স্ক্রিপ্টটি লিখছি তা ভাগ করতে চাই।

আমি সচেতন cutযে মূল তালিকাটি কেটে ফেলার জন্য এটি করা যেতে পারে , তবে এটি একটি সাবওটিমাল সমাধানের মতো বলে মনে হচ্ছে। এর থেকে আরও ভাল সমাধান কি পাওয়া যায়?


find diskimg/* | cut -d '/' -f2-
nik.shornikov

উত্তর:


18

আপনি যা করার চেষ্টা করছেন তা যদি খুব জটিল না হয় তবে আপনি এটি সিড দিয়ে সম্পন্ন করতে পারেন:

find diskimg | sed -n 's|^diskimg/||p'

বা cut:

find diskimg | cut -sd / -f 2-

আপনি কমান্ডের জন্য (প্রায়) যে কোনও বিভাজক চয়ন করতে পারেন, সুতরাং: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(নোট আমি '-e' যোগ করেছিলাম এবং একটি ^ভাল অনুশীলনও (এখানে প্রয়োজনীয় নয়, আপনি নিশ্চিত যে প্রতিটি লাইনে এটি থাকবে ... তবে এখনও ভাল অনুশীলন , এবং কিছু সিপিইউ সংরক্ষণ করে;))
অলিভিয়ার ডুলাক

গ্রেপ ছাড়াই অন্যভাবে: find diskimg | sed -e 's|^diskimg/*||' ('/ *' কোনও '/' এর সংখ্যার সাথে মিলে যাবে, এমনকি 0)
অলিভিয়ার ডুলাক

এই cutআদেশটি আমি যেটি ব্যবহার করেছি তার চেয়ে পরিষ্কার clean আমি এটা পছন্দ করি. ( sedসমাধানটিও দুর্দান্ত, তবে এর পুনরাবৃত্তিটি diskimg/একটু দুর্ভাগ্যজনক)।
nneonneo

30

cd ডিরেক্টরিতে প্রথম:

cd diskimg && find . 

সমাপ্তির পরে, আপনি আপনার মূল ডিরেক্টরিতে ফিরে আসবেন।

আপনার ফাইলগুলি এই ক্ষেত্রে ./ দিয়ে চাপ দেওয়া হবে; আমি প্রায় যে উপায়টি দেখতে পাচ্ছি এটি ব্যবহার করবে cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

আপনার শেলের বর্তমান ডিরেক্টরিটি পরিবর্তন করা এড়াতে সাবসেল ব্যবহার করুন (যদি আপনি পাইপটির বাম-হাতটি ইতিমধ্যে সাবসেলের মধ্যে চালিত হয় তবে আউটপুটটি পাইপিং করা হয় না)।

(cd diskimg && find .)

5
সমাপ্ত মূল Dir ফিরে করুন: প্রথম বন্ধনী যোগ করুন: (cd diskimg && find . ; )। এই উপায়ে cd diskimg && find .একটি সাবশেলে সম্পন্ন করা হয়: যখন এই সাবশেলটি প্রস্থান করে আপনি আপনার নিজের শেলটিতে ফিরে আসবেন, আপনি যে কোনও ডিরেক্টরিতে ছিলেন in
অলিভিয়ার ডুলাক

1
find *অকেজো উপসর্গের চারপাশে আরেকটি উপায়
nik.shornikov

23

আরেকটি, আরও জটিল তবে কেবল আমার অন্যান্য উত্তর থেকে পদ্ধতির সন্ধান করুন:

find diskimg -mindepth 1 -printf '%P\n'

findসমর্থনের সমস্ত সংস্করণ নয় printf
জর্ডানম

1
নিশ্চয়; আমার ওএসএক্স এটি করে না, মনে হয়। আংশিকভাবে কেন আমি অন্য সমাধানের প্রস্তাব দিয়েছিলাম।
স্টিফান

2
@ স্টেফান - পরের বার আপনি এই ধরণের উত্তরগুলিকে একক মধ্যে একত্রিত করতে পারেন। এই জাতীয় রূপগুলির জন্য একাধিক উত্তর দেওয়ার দরকার নেই।
slm

2
কেবল জিএনইউ findসমর্থন করে -printf, যখন অনেক বিএসডি findগুলি জিএনইউর কয়েকটি বৈশিষ্ট্য findঅনুলিপি করেছে, কেউই এখনও অনুলিপি -printfকরেনি (এএফআইকে)।
স্টাফেন চেজেলাস

%Pআপেক্ষিক পাথ জন্য আমি কী প্রয়োজন ছিল তা ছিল না।
Fl0v0

4

realpathইউটিলিটি ব্যবহার করুন :

find diskimg -exec realpath --relative-to diskimg {} \;

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