আমি কীভাবে কেবল ফাইন্ড কমান্ড থেকে ফাইলের নাম ফিরিয়ে দেব?


14

টার্মিনাল থেকে ফাইন্ড কমান্ড কার্যকর করার সময় আমি কেবল ফাইল নামের (বাকি পথ ছাড়াই) একটি তালিকা পেতে চাইছি। আমি কীভাবে ম্যাকটিতে এটি সম্পাদন করব?

উত্তর:


18

বেস নাম সহ:

find . -type f -exec basename {} \;


কোঁকড়া ধনুর্বন্ধনী জন্য কি?
নালপোটেন্ট

বেসনাম প্রতিটি পাওয়া ফাইলের জন্য একবার চালানো হয়, {} দ্বারা চিহ্নিত করা হয়}
Рахматуллин

\ এবং এর অর্থ কী; ?
নিউউইগুর

@ নিউউইগার ;এই -execক্রিয়াটি বন্ধ করে দিয়েছে । \ প্রয়োজন কারণ ;এছাড়াও শেল বিশেষ অর্থ আছে।
বিট্রি

6

ইভিলসপ উল্লেখ করেছিলেন যে যা পোস্ট করা হয়েছিল তা ফাঁক করা ফাইলের নামের জন্য কাজ করে না। সুতরাং পরিবর্তে আপনি ব্যবহার করতে পারেন:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

এটি তাদের নামের ফাঁকা জায়গাগুলির সাথে ফাইলগুলিতে
বিভক্ত হবে

গতির জন্য +1। আমি জানি না আমি কোনও ভুল করেছি কিনা, তবে এটি আমার OME HOM এ 1 সেকেন্ড নিয়েছিল, অন্যদিকে প্রায় 10 সেকেন্ড সময় নিয়েছিল। অবশ্যই এটি দেখতে এবং এটি টাইপ করতে আমার 10 সেকেন্ডের বেশি প্রয়োজন হবে।
পাওলো আলমেদা

2

জিএনইউ অনুসন্ধানের সাহায্যে আপনি এটি করতে পারেন:

 find ~/tmp/ -printf "%f\n"

এটি সম্ভবত ওএস এক্সেও চেষ্টা করার মতো।


2
-printfওএস এক্স এর বিএসডি সমর্থন করে না find
ড্যানিয়েল অঙ্গুলিনির্দেশ

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

আমি একমত নই যে এটি একটি ভিন্ন প্রসঙ্গে একই ধরণের কাজ সম্পাদনের জন্য কোনও পরিচিত ফাংশন নামটি ব্যবহার করা খারাপ বিবেচনা করা হয়। বিএসডি সম্ভবত কখনই এটি সমর্থন করবে না এটি অন্য বিষয়।
Рахматуллин

2

ফাইল পথের শেষ অংশ ব্যতীত সমস্ত কিছু কেটে ফেলার আরও ভাল উপায় আছে; অজস্র সহ এটি আরও ভাল কারণ প্রতিটি ফাইলের জন্য awk একবার সম্পাদিত হয় না। কিছু ক্ষেত্রে এটি গুরুত্বপূর্ণ।

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

আমরা কেবলমাত্র ~ / tmp ফাইল অনুসন্ধান করি এবং আমরা একটি তালিকা পাই যেখানে প্রতিটি এন্ট্রি স্ল্যাশ দ্বারা পৃথক করা হয়। অতএব, আমরা ফিল্ড বিভাজক (-F /) হিসাবে স্ল্যাশ ব্যবহার করি এবং ফিল্ড প্যারামিটার ($ 1 .. $ 9) মুদ্রণ করি যা সর্বশেষ ক্ষেত্রের সাথে মিলিত হয় () NF)।


এটিই আমি দ্রুততম পরীক্ষিত।
পাওলো আলমেদা

আমি ইদানীং সাইগউইনকে ব্যবহার করেছি, এবং উইন্ডোতে একটি প্রক্রিয়া তৈরি করা অত্যন্ত ব্যয়বহুল ...
Рахматуллин Рахматуллин

2

সম্পাদনা :

ব্যবহার sed:

$ find . -type f | sed 's/.*\///'

@ ওয়ার্ডওয়ালারের প্রতিক্রিয়াতে যেমন xargs কমান্ডটি ব্যবহার করা হয়েছে

$ find . -type f -print0 | xargs --null -n1 basename

1
এটি চিহ্নিত করার জন্য ধন্যবাদ, +1, আমি xargs বেশি ব্যবহার করি নি ... অবশ্যই আপনি আমার কমান্ড থেকে বেশ কয়েকটি অক্ষর বাদ দিয়েছিলেন তা অবশ্যই করা উচিত।
নার্ডওয়ালার

ফাইলগুলির ফাঁকা স্থান থাকা অবস্থায় এটি ভেঙে যায়। এটি অন্তত একটি দ্রুত পরীক্ষার ক্ষেত্রে এটির মতো কাজ করে:find . -type f -print0| xargs --null -n1 basename
পাওলো আলমেইডা

ওএসএক্স--null-n1
ভ্যালেরি ভ্যান

1

এই সম্পর্কে কি:

find … | egrep -o -e '[^/]+$'

সুবিধা: প্রতিটি ফলাফলের জন্য এক নয়, কেবল একটি অতিরিক্ত প্রক্রিয়া তৈরি হয়।


0

আপনি ফাইন্ডের বিকল্পের shমধ্যে থেকে কল করতে পারেন -execএবং আনয়েসেসারি পাইপ ব্যবহার করা এড়াতে পারেন। এরও সুবিধা রয়েছে যে আপনার মজাদার ফাইলের নামগুলি (স্পেস, নিউলাইনস ইত্যাদি) নিয়ে চিন্তা করার দরকার নেই:

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.