मैं एक टर्मिनल से खोज कमांड निष्पादित करते समय बस फ़ाइल नामों की सूची (बाकी पथ के बिना) प्राप्त करना चाहता हूं। मैं इसे मैक पर कैसे पूरा करूं?
मैं एक टर्मिनल से खोज कमांड निष्पादित करते समय बस फ़ाइल नामों की सूची (बाकी पथ के बिना) प्राप्त करना चाहता हूं। मैं इसे मैक पर कैसे पूरा करूं?
जवाबों:
बेसनेम के साथ:
find . -type f -exec basename {} \;
;
समाप्त करता -exec
है। \
जरूरत है क्योंकि है ;
भी खोल करने के लिए विशेष अर्थ नहीं है।
एविल्सअप ने उल्लेख किया कि जो पोस्ट किया गया था, वह स्थानिक फ़ाइल नामों के लिए काम नहीं करता है। इसलिए इसके बजाय आप उपयोग कर सकते हैं:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
GNU खोज के साथ, आप यह कर सकते हैं:
find ~/tmp/ -printf "%f\n"
यह शायद ओएस एक्स में भी कोशिश करने लायक है।
-printf
OS X के BSD पर समर्थित नहीं है find
।
-printf
C printf
या POSIX शेल उपयोगिता के लिए बहुत कम संबंध हैं printf
। कुछ अलग करने के लिए इस ऐतिहासिक फ़ंक्शन नाम का उपयोग करना बहुत खराब माना जाता है। रूढ़िवादी बीएसडी लोग इसे उसी तरह से देखते हैं, इसलिए हम संभवतः -printf
बीएसडी खोज में क्लोन को उस नाम के तहत नहीं देखेंगे ।
सब कुछ छीनने का एक बेहतर तरीका है लेकिन एक फ़ाइल पथ का अंतिम भाग; जाग के साथ। यह बेहतर है क्योंकि awk को हर फ़ाइल के लिए एक बार निष्पादित नहीं किया जाता है। कुछ मामलों में यह मायने रखता है।
find ~/tmp/ -type f | awk -F/ '{ print $NF }'
हम केवल ~ / tmp में फ़ाइलों की तलाश करते हैं और हमें एक सूची मिलती है जहाँ हर प्रविष्टि को स्लैश द्वारा अलग किया जाता है। इसलिए, हम फ़ील्ड विभाजक (-F /) के रूप में एक स्लैश का उपयोग करते हैं और फ़ील्ड पैरामीटर ($ 1 .. $ 9) प्रिंट करते हैं जो अंतिम फ़ील्ड ($ NF) से मेल खाती है।
संपादित करें :
का उपयोग कर sed
:
$ find . -type f | sed 's/.*\///'
का उपयोग करते हुए xargs , आदेश के रूप में @nerdwaller के जवाब में उल्लेख किया
$ find . -type f -print0 | xargs --null -n1 basename
find . -type f -print0| xargs --null -n1 basename
--null
-n1
इस बारे में क्या:
find … | egrep -o -e '[^/]+$'
लाभ: वास्तव में केवल एक अतिरिक्त प्रक्रिया है, प्रत्येक परिणाम के लिए एक नहीं।