खोज के साथ 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
(GND में उपलब्ध BSD एक्सटेंशन find
) का उपयोग करने में सक्षम हो सकते हैं , जो chdir()
फ़ाइल की निर्देशिका के लिए है:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
खबरदार, हालांकि यह है कि जब से जीएनयू कार्यान्वयन find
का विस्तार होगा {}
करने के लिए ./filename
यहाँ, बीएसडी वालों के लिए विस्तार filename
। यह यहां ठीक है क्योंकि फ़ाइल नाम एक विकल्प के तर्क के रूप में पारित किया गया है और हमेशा featured.mp4
वैसे भी होता है, लेकिन अन्य उपयोगों के लिए आपको इस बात का ध्यान रखना होगा कि फ़ाइल नाम के साथ शुरू हो सकता है ( -
या +
कमांड द्वारा एक विकल्प के रूप में समझा जा सकता है) या इसमें शामिल हैं =
(और उदाहरण के लिए awk द्वारा एक चर असाइनमेंट के रूप में समझा जा सकता है), या अन्य वर्ण इस तरह की समस्या काperl -p/n
कारण बनते हैं (उन सभी को नहीं जो GNU find
के ./
उपसर्ग द्वारा तय किए गए हैं हालांकि उस मामले में), आदि, जिसे आपको ध्यान में रखना होगा। ।
-printf
%h
फ़ाइल का नाम (सभी लेकिन पिछले तत्व) के अग्रणी निर्देशिका। यदि फ़ाइल नाम में कोई स्लैश नहीं है (क्योंकि यह वर्तमान निर्देशिका में है)% h विनिर्देशक का विस्तार होता है "।" ।