bash find: পাওয়া ফাইলের ডিরেক্টরি পান get


12

আমার প্রচুর সাব-ফোল্ডার সহ "প্যারেন্ট_ফোল্ডার" নামে একটি পিতামাতার ফোল্ডার রয়েছে, এই সাবফোল্ডারগুলিতে "foo.mp4" নামে একটি ফাইল রয়েছে।

এটি করে আমি সহজেই এই ফাইলগুলি খুঁজে পেতে পারি:

mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;

এখন যে প্রতিটি ফাইলের পথটি ফিরে আসে, প্যারেন্ট_ফোল্ডার / এর সাথে সম্পর্কিত

./path/to/foo.mp4

ফাইল নাম বাদ দিয়ে কীভাবে আমি ঠিক পথে ফিরতে পারি?


1
man find ( ACTIONS ): -printf %h ফাইলের নামের শীর্ষস্থানীয় ডিরেক্টরি (শেষ উপাদানটি বাদে সমস্ত)। যদি ফাইলের নামের কোনও স্ল্যাশ না থাকে (যেহেতু এটি বর্তমান ডিরেক্টরিতে রয়েছে)% h নির্দিষ্টকারীটি "এ প্রসারিত হয়।"
কস্টাস

আপনি একটি উদাহরণ দেখাতে পারেন? আমি কি '-Exec' পিছনে রাখা উচিত?
দুবলবেজ

find ./ -name "foo.mp4" -printf "%h\n"প্রতিটি পাওয়া ফাইলের জন্য পাথ মুদ্রণ করবে (এক এক করে লাইন)। যথারীতি কেউ ব্যবহার করেন -exec echo {}না তাই এখানে -print(ডিফল্ট এমনকি বাদ দেওয়া) বা printfক্রিয়া রয়েছে।
কস্টাস

2
@ কাস্টাস, -printfকেবল জিএনইউ -র । ওপি'র উল্লেখযোগ্য ওএস / এক্স (একটি বিএসডি সিস্টেম)।
স্টাফেন চেজেলাস 23'15

@ স্টাফেনচাজেলাস ধন্যবাদ আমি ওএস / এক্স (বিএসডি) এর মতো সীমাবদ্ধতা জানতাম না। দরিদ্র ম্যাক 'ব্যবহারকারীরা!
কস্টাস

উত্তর:


20

সন্ধানের সাথে GNU:

 find . -name foo.mp4 -printf '%h\n'

অন্যান্য findগুলি এর সাথে, প্রদত্ত ডিরেক্টরি নামগুলিতে নতুন লাইন অক্ষর থাকে না:

 find . -name foo.mp4 | sed 's|/[^/]*$||'

বা:

 find . -name foo.mp4 -exec dirname {} \;

যদিও এর অর্থ dirnameপ্রতি ফাইলের জন্য একটি কমান্ড চালানো ।

যদি আপনাকে এটিতে কোনও কমান্ড চালানোর দরকার হয় তবে আপনি এটি pathকরতে পারেন (স্ট্যান্ডার্ড সিনট্যাক্স):

 find . -name "featured.mp4" -exec sh -c '
   for file do
     dir=${file%/*}
     ffmpeg -i "$file" -c:v libvpx -b:v 1M -c:a libvorbis "$dir" featured.webm
   done' sh {} +

যদিও এই ক্ষেত্রে, আপনি -execdir(জিএনইউতে বিএসডি এক্সটেনশন উপলব্ধ find) ব্যবহার করতে পারবেন যা chdir()ফাইলের ডিরেক্টরিতে রয়েছে:

 find . -name "featured.mp4" -execdir \
   ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;

GNU বাস্তবায়ন এখানে findপ্রসারিত {}হওয়ার ./filenameপরেও, বিএসডি এর মধ্যে প্রসারিত হওয়া সতর্ক থাকুন filenamefeatured.mp4ফাইল নামটি কোনও বিকল্পের পক্ষে যুক্তি হিসাবে প্রেরণ করার পরে এবং সর্বদা এটির জন্য ঠিক আছে তবে অন্য ব্যবহারের জন্য আপনাকে ফাইলের নামটি শুরু হতে পারে -বা +(এবং কমান্ড দ্বারা একটি বিকল্প হিসাবে বোঝা যায়) বা ধারণ থাকতে পারে এমন অ্যাকাউন্টেও আপনাকে নিতে হবে =(এবং উদাহরণস্বরূপ awk দ্বারা একটি পরিবর্তনশীল অ্যাসাইনমেন্ট হিসাবে বোঝা), বা অন্যান্য অক্ষর যা এই ধরণের সমস্যাperl -p/n সৃষ্টি করে (তাদের ক্ষেত্রে GNU findএর ./উপসর্গ দ্বারা স্থির নয় ), ইত্যাদি, যা আপনাকে বিবেচনায় নিতে হবে ।


আপনি যখন আবেদন করবেন find ., ডাইরনাম হিসাবে আপনার কাছে থাকবে। পরিবর্তে পুরো পথ।
ফারসিগাল্ফ

এখন আমি কীভাবে এটি অনুবাদ করব? find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \; আপনার উল্লিখিত দ্বিতীয় পরামর্শটি আমি ব্যবহার করছি।
দুবলবেজ

@ মোহেনপাহলেভানজাদেহ, ওপি কোনও নিখুঁত পথের জন্য জিজ্ঞাসা করেনি, তবে সেই পথটির নামকরণের জন্য।
স্টাফেন চেজেলাস 23'15

@ স্টাফেনচেজেলাস ভোট দেওয়ার জন্য দুঃখিত।
ফার্সিগাল্ফ

ধন্যবাদ @ স্টাফেনচাজেলাস। তুমি আমাকে একটি ffmpeg কিউ / ব্যাচ করতে সাহায্য করেছে
dubbelj

-1

নীচে কমান্ডটি কেবল ডিরেক্টরি বিশদ বিবরণ আনতে ব্যবহার করা যেতে পারে।

find ./ -name "foo.mp4" | rev | cut -d"/" -f2- | rev

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