मैं खोज आदेश से केवल फ़ाइल नाम कैसे वापस करूं?


14

मैं एक टर्मिनल से खोज कमांड निष्पादित करते समय बस फ़ाइल नामों की सूची (बाकी पथ के बिना) प्राप्त करना चाहता हूं। मैं इसे मैक पर कैसे पूरा करूं?

जवाबों:


18

बेसनेम के साथ:

find . -type f -exec basename {} \;


के लिए घुंघराले ब्रेसिज़ क्या हैं?
nullpotent

बेसनैम को हर एक फ़ाइल के लिए एक बार चलाया जाता है, जिसे {} द्वारा दर्शाया जाता है।
урослав Рахматуллин

\ _ का मतलब क्या है; ?
नवयुगल

@neouyghur कार्रवाई को ;समाप्त करता -execहै। \ जरूरत है क्योंकि है ;भी खोल करने के लिए विशेष अर्थ नहीं है।
8bittree

6

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

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

यह उनके नाम पर रिक्त स्थान वाली फाइलों पर टूट जाएगा (देखें
ग्रिग्स

गति के लिए +1। मुझे नहीं पता कि मैंने कुछ गलत किया है, लेकिन इसने मेरे $ HOME पर 1 सेकंड लिया, जबकि अन्य सभी को लगभग 10 सेकंड का समय लगा। बेशक, मुझे इसे देखने और इसे टाइप करने के लिए 10 सेकंड से अधिक की आवश्यकता होगी।
पाउलो अल्मीडा

2

GNU खोज के साथ, आप यह कर सकते हैं:

 find ~/tmp/ -printf "%f\n"

यह शायद ओएस एक्स में भी कोशिश करने लायक है।


2
-printfOS X के BSD पर समर्थित नहीं है find
डैनियल बेक

1
इसके अलावा, -printfC printfया POSIX शेल उपयोगिता के लिए बहुत कम संबंध हैं printf। कुछ अलग करने के लिए इस ऐतिहासिक फ़ंक्शन नाम का उपयोग करना बहुत खराब माना जाता है। रूढ़िवादी बीएसडी लोग इसे उसी तरह से देखते हैं, इसलिए हम संभवतः -printfबीएसडी खोज में क्लोन को उस नाम के तहत नहीं देखेंगे ।
कज़

मैं असहमत हूं कि एक अलग कार्य को एक अलग संदर्भ में करने के लिए एक परिचित फ़ंक्शन नाम का उपयोग करना खराब माना जाता है। क्यों बीएसडी शायद कभी समर्थन नहीं करेगा यह एक और मामला है।
урослав Рахматуллин

2

सब कुछ छीनने का एक बेहतर तरीका है लेकिन एक फ़ाइल पथ का अंतिम भाग; जाग के साथ। यह बेहतर है क्योंकि awk को हर फ़ाइल के लिए एक बार निष्पादित नहीं किया जाता है। कुछ मामलों में यह मायने रखता है।

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

हम केवल ~ / tmp में फ़ाइलों की तलाश करते हैं और हमें एक सूची मिलती है जहाँ हर प्रविष्टि को स्लैश द्वारा अलग किया जाता है। इसलिए, हम फ़ील्ड विभाजक (-F /) के रूप में एक स्लैश का उपयोग करते हैं और फ़ील्ड पैरामीटर ($ 1 .. $ 9) प्रिंट करते हैं जो अंतिम फ़ील्ड ($ NF) से मेल खाती है।


यह सबसे तेज परीक्षण है।
पाउलो अल्मीडा

मैं हाल ही में Cygwin का उपयोग कर रहा हूं, और विंडोज़ में एक प्रक्रिया बनाना सुपर महंगा है ...
Cyрослав Рахматуллин

2

संपादित करें :

का उपयोग कर sed:

$ find . -type f | sed 's/.*\///'

का उपयोग करते हुए xargs , आदेश के रूप में @nerdwaller के जवाब में उल्लेख किया

$ find . -type f -print0 | xargs --null -n1 basename

1
यह इंगित करने के लिए धन्यवाद कि +1 में से, मैंने xargs का अधिक उपयोग नहीं किया है ... निश्चित रूप से आपको मेरी आज्ञा से कुछ वर्णों को छोड़ने के बाद से करना चाहिए।
nerdwaller

फ़ाइलों के रिक्त स्थान होने पर यह टूट जाता है। यह इस तरह से काम करता है, कम से कम एक त्वरित परीक्षण में:find . -type f -print0| xargs --null -n1 basename
पाउलो अल्मेडा

OSX--null-n1
Valeriy Van

1

इस बारे में क्या:

find … | egrep -o -e '[^/]+$'

लाभ: वास्तव में केवल एक अतिरिक्त प्रक्रिया है, प्रत्येक परिणाम के लिए एक नहीं।


0

आप shखोज के -execविकल्प के भीतर से कॉल कर सकते हैं और अनसिक्योर्ड पाइप का उपयोग करने से बच सकते हैं। इससे यह भी फायदा होता है कि आपको फनी फिल्म्स (स्पेस, न्यूलाइन्स इत्यादि) के बारे में चिंता करने की जरूरत नहीं है।

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.