2012-02-08 22 views
18

मैं एक ksh स्क्रिप्ट में खोज कमांड का उपयोग कर रहा हूं, और मैं पूर्ण पथ की बजाय केवल फ़ाइल नाम पुनर्प्राप्त करने का प्रयास कर रहा हूं। जैसा कि, मैं इसे text.exe वापस करना चाहता हूं, //severname/dir1/dir2/text.exe नहीं।पास केवल फ़ाइल नाम प्रिंट करें, पूर्ण पथ नहीं

मैं इसे पाने के बारे में कैसे जाऊं? स्पष्टीकरण के लिए, मुझे पता है कि फाइलें किस निर्देशिका में हैं, मैं सिर्फ एक सीटिन तिथि बनने वाले लोगों को पकड़ रहा हूं, इसलिए पथनाम कोई फर्क नहीं पड़ता।

find ..... |sed 's#.*/##' 

लेकिन यह वास्तव में मतलब है:

+2

संभव डुप्लिकेट [कैसे केवल लिनक्स के साथ फ़ाइल नाम पाने के लिए \ 'लगता है \'?] (Http://stackoverflow.com/questions/5456120/how-to-only-get-file-name- साथ-linux-find) – BroSlow

+0

इसका उत्तर भी दिया गया है [यहां] (http://stackoverflow.com/questions/5456120/how-to-only-get-file-name-with-linux-find)। – sebastian

+0

इस के लिए बहुत सारे डुप्लिकेट https://serverfault.com/questions/354403/remove-path-from-find-command-output – michael

उत्तर

6

उसे अपने साथ कर सकते हैं? यदि एक ही फ़ाइल नाम के साथ दो फाइलें हैं लेकिन विभिन्न निर्देशिकाओं में स्थित हैं, तो आप उन्हें कैसे अलग कर सकते हैं?

उदा।

you are in /foo 

/foo/a.txt 
/foo/bar/a.txt 

संपादित

संपादित जवाब कुछ बेहतर पाठ स्वरूपण हासिल करने के लिए।

आप टिप्पणी में वर्णित है, तो आप कुछ फ़ाइलों को खोजने के

  1. करना चाहते हैं,
  2. एक निर्देशिका करने के लिए उन्हें कॉपी,
  3. एक संग्रह करने के लिए उन्हें gzip कहना a.gz
  4. निकालने की नकल की फ़ाइलों को केवल यदि चरण 2 सफल रहा था

यह एक शॉट में किया जा सकता है:

012,
find ...|xargs tar -czf /path/to/your/target/a.gz 

यह फाइलें पायेगा, आपके लक्ष्य डीआईआर को एक tar (a.gz) बनाएं।

+0

ठीक है, मैं खोज का उपयोग कर रहा हूं क्योंकि मैं बाद में बनाई गई सभी फ़ाइलों को पकड़ने की कोशिश कर रहा हूं एक निश्चित तारीख, -mtime का उपयोग कर। क्या कोई बेहतर तरीका है? – Steve

+0

@Steve आप 'find' द्वारा मिली फ़ाइलों के साथ क्या करेंगे? निर्देशिका जानकारी को हटाने की कोई विशेष आवश्यकता है? – Kent

+1

हाँ, मैं उन्हें दूसरी निर्देशिका में कॉपी करने जा रहा हूं और फिर उनके साथ सामान कर रहा हूं, इसलिए मैं चाहता हूं कि वास्तविक फ़ाइल नाम हो। अन्यथा, मुझे फिर से खोजना होगा। – Steve

8
find ... -exec basename {} \; 

चाल भी करेगा .. लेकिन जैसा कि @ केंट पूछता है, आप यह क्यों चाहते हैं?

+0

इस उत्तर में '-exec' का उपयोग करके प्रत्येक फ़ाइल में एक बाहरी प्रोग्राम चलाया जाता है। @ -printf' विकल्प का उपयोग करके @ glennjackman का जवाब फाइलों और ऑपरेटिंग सिस्टम की संख्या के आधार पर बहुत तेज़ हो सकता है। –

+0

@ स्टीफन गोरिचॉन यह गैर-जीएनयू सिस्टम के लिए एक अच्छा जवाब है। OpenBSD 'find' – sheepdog

+0

में कोई भी '-प्रिंटफ़'' नहीं है (लेकिन गैर-जीएनयू के लिए जरूरी नहीं है), वहां 'बेसनेम-ए' विकल्प है जो कई तर्कों में गुजरने की अनुमति देता है, और एक 'ढूंढ' विकल्प जो गुजरने की अनुमति देता है '-exec' के लिए कई तर्क, इसलिए यदि प्रदर्शन वास्तव में एक मुद्दा है, तो यह मदद कर सकता है:' ढूंढें ... -exec basename -a {} + '(' '' '' '' '' '' '' '' '' ' – michael

51

आप जीएनयू को खोजने का उपयोग कर रहे है, तो

find path -printf "%f\n" 

सिर्फ फ़ाइल नाम प्रिंट और पथ को बाहर निकाल देगा तो।

2

यहां एक और जवाब है।

find | awk -F/ '{print $NF}'  
की
संबंधित मुद्दे