কীভাবে ইউনিক্সে "./" সন্ধান করতে হবে "সন্ধান করুন"?


140
find . -type f -print

প্রিন্ট আউট

./file1
./file2
./file3

এটিকে প্রিন্ট করার কোনও উপায়

file1
file2
file3

?


1
আপনি যদি আপনার ব্যবহার -exec /path/to/myscript.sh {} করেন find, -printf '%P\n'কাজ করে না। পরিবর্তে, আমাকে ./স্ক্রিপ্টের অভ্যন্তরে উপসর্গটি করতে হবে p=${1#"./"}
লিখেছেন

আপনি যদি এটি কেবল একটি একক ফাইলের জন্য করছেন:f=`find . -name migration`; echo ${f/.\//}
মাস্টারেক্সিলো

উত্তর:


38

যদি তারা কেবল বর্তমান ডিরেক্টরিতে থাকে

find * -type f -print

তুমি কি এটাই চাও?


21
এটি সময়ের সাথে শুরু হওয়া নামগুলির সাথে ফাইলগুলি মিস করবে।
শান

2
খারাপ, শেল সেটিংসের উপর নির্ভর করে * "লুকানো" ফাইল / ডিরেক্টরি - যা ডট (।) দিয়ে শুরু হয় আপনার হোম ডায়ারে এই কমান্ডটি চালানোর চেষ্টা করুন, তারপরে "সন্ধান করুন-টাইপ চ" এবং পার্থক্যটি দেখুন ।
ইলিয়া কে।

35
আরও প্রাসঙ্গিক উদ্বেগ হ'ল '*' শেল দ্বারা মূল্যায়ন করা হয়। আপনার কার্যকরভাবে এক ধরণের দূষিত কোড ইঞ্জেকশন পরিস্থিতি রয়েছে। '--Exec rm' এবং 'zzzz;' নামে অন্য একটি ফাইল তৈরি করা তুচ্ছ হবে। বিদায় ফাইল।
সিডব্লুএফএফ

6
এটি অনিরাপদ। যদি কোনও ফাইলের নাম ড্যাশ দিয়ে শুরু হয় তবে এটি সন্ধানের বিকল্প হিসাবে বিবেচিত হবে এবং ব্যর্থ হতে পারে বা সম্ভাব্য ক্ষতি করতে পারে।
ডেল অ্যান্ডারসন

4
কেন -printপ্রয়োজন? এটি পতাকা ছাড়াই একই ফলাফল দিয়েছে।
ব্যবহারকারী 13107

239

কেবলমাত্র বর্তমান ডিরেক্টরিতে নিয়মিত ফাইলগুলি সন্ধান করুন এবং ./এটিকে প্রিফিক্স ছাড়াই মুদ্রণ করুন :

find -type f -printf '%P\n'

মানুষের সন্ধান থেকে, -printfবিন্যাসের বর্ণনা :

% P ফাইলের নাম সহ কমান্ড লাইন যুক্তির নাম যুক্ত করা হয়েছে যার অধীনে এটি মুছে ফেলা হয়েছে।


18
+1 ভাল সংস্করণ যদি আপনার সংস্করণ findসমর্থন করে -printf(সমস্ত না করে)।
টড ওভেন

2
হিসাবে টড বলেন, কিন্তু আরো সঠিকভাবে: এটা POSIX 7. নয়
সিরো Santilli郝海东冠状病六四事件法轮功

8
সমর্থিত বা না, এটি অবশ্যই গৃহীত উত্তরের চেয়ে নিরাপদ।
ডেল অ্যান্ডারসন

10
আপনি যদি এটিতে পাইপ করতে চান তবে \0পরিবর্তে আপনি ব্যবহার করতে পারেন (উদাহরণস্বরূপ ফাইলের \nxargs -0find -type f -printf '%P\0' | xargs -0 head
নামগুলিতে

1
@ কোয়ানলং, এটি ম্যাকোজে কাজ করে যদি আপনি brew install findutils;)
ব্লকলুপ

58

সেড ব্যবহার করুন

find . | sed "s|^\./||"

2
এটি আমার পছন্দের সমাধান; এটি পসিক্স-সামঞ্জস্যপূর্ণ (কার্যত সর্বত্র, এমনকি এম্বেড হওয়া সিস্টেমগুলিও কাজ করে) খুব সংক্ষিপ্ত এবং অপ্রত্যাশিত আচরণের ফলস্বরূপ unlikely এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
জুডি ব্রুচন

6
এর সাথে কীভাবে মিলিত হবে find -exec?
পল উইন্টজ

find -exec sh -c "echo {} | sed 's|^\./||'" \; বা find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

এটি খাটো হতে পারে

find * -type f

2> /dev/nullকমান্ডটি খালি ডিরেক্টরিতে চালিত হলে ত্রুটির প্রতিবেদন করা এড়ানো ভাল ।
neevek

2

স্ট্রিপিংয়ের আরেকটি উপায় ./হ'ল cutলাইক ব্যবহার করে:

find -type f | cut -c3-

আরও ব্যাখ্যা এখানে পাওয়া যাবে


2

./ কেটে ফেলার আরেকটি উপায়

find * -type d -maxdepth 0

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

2

যেহেতু -printfঅপশনটি ওএসএক্স উপলব্ধ নয় findএখানে আর মাত্র একটি কমান্ড উপর ওএসএক্স কাজ করবে, ধরো যদি যে যদি কেউ ইন্সটল করতে চান না হয় gnu findব্যবহার brewইত্যাদি:

find . -type f -execdir printf '%s\n' {} + 

1
দুর্ভাগ্যক্রমে এটি মধ্যবর্তী সাব-ডাইরেক্টরিগুলি সহ প্রতিটি পাওয়া ফাইলের পুরো পথটি সরিয়ে দেয় এবং কেবল ফাইলের নামটিই প্রিন্ট করে।
পিএলএল

1
তুমি ঠিক. এই সমাধানটি কেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইলের জন্য ভাল। নেস্টেড ফাইলগুলির জন্য আমাদের ব্যবহার করতে হবে:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
অনুভা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.