बिना पाथ के केवल कमांड से नाम कैसे प्राप्त करें


14

मैं खोज परिणाम से केवल नाम खोजने की कोशिश कर रहा हूं, लेकिन इसमें हमेशा निर्देशिकाएं भी शामिल हैं। मैं खोज का उपयोग करके केवल नाम (या किसी चर को निर्दिष्ट) कैसे मुद्रित कर सकता हूं

find trunk/messages/ -name "*.po" -printf '%f\n'

इसी तरह के एक कमांड को एक चर में निर्दिष्ट करने के लिए जैसे "संसाधन" इसे बाद में उपयोग करने के लिए।

संपादित करें: और यदि संभव हो तो केवल एक्सटेंशन को छोड़कर नाम।

जवाबों:


20

उपयोग find trunk/messages/ -name "*.po" -exec basename {} .po \;

उदाहरण और स्पष्टीकरण:

कुछ परीक्षण फ़ाइलें बनाएँ:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

ठीक है, फ़ाइलें मिल जाती हैं, पथ सहित।

प्रत्येक परिणाम के लिए basename, नाम के .po भाग को निष्पादित करें और पट्टी करें

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2

बहुत धन्यवाद :)। क्या मैं केवल dirs से PO एक्सटेंशन को छीन सकता हूं? मेरा मतलब है: dir1 / po1.po और dir2 / po2.po उन्हें dir1 / po1 और dir2 / po2 की तरह मिल सकते हैं?
जगा

@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck

@slhck धन्यवाद अंत में मुझे एक्सटेंशन के बिना फ़ाइलनाम प्राप्त करने की आवश्यकता है और अंतिम फ़ोल्डर जहां यह है: जैसे: dir1 / subdir1 / subsubdir1 / po1.po और dir2 / subdir2 / subsubdir2 / po2.po को एक चर पर सेट किया जाना चाहिए: subsubdir1 / po1 subsubdir2 / po2, क्रमशः।
जाग

@ user1754665 हम्म, शायदfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
बजे

@ हेन्स आखिरी में घुंघराले ब्रेस खोलने से पहले बैकस्लैश का उद्देश्य क्या है find?
Utku

3

आप -execdirपैरामीटर का उपयोग कर सकते हैं, जो पथ के बिना फ़ाइल को प्रिंट करेगा, जैसे:

find . -name "*.po" -execdir echo {} ';'

एक्सटेंशन के बिना फ़ाइलें:

find . -name "*.txt" -execdir basename {} .po ';'

नोट: चूँकि यह POSIX नहीं है, BSD findस्वच्छ फ़ाइलनामों को प्रिंट करेगा, हालाँकि GNU का उपयोग findकरने से अतिरिक्त प्रिंट होगा ./

देखें: बीएसएनडी की खोज की तुलना में GNU खोज -execir कमांड अलग-अलग व्यवहार क्यों करती है?


1

एक आदेश के आधार पर मैं यहाँ पाया गया: http://www.unixcl.com/2009/08/remove-path-from-find-result-in-bash.html

आप इसका उपयोग कर सकते हैं sed(जो basenameदृष्टिकोण के मुकाबले मेरे लिए तेजी से निष्पादित ):

find trunk/messages/ -name "*.po" | sed 's!.*/!!' | sed 's!.po!!'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.