कैसे "" ./ "को यूनिक्स में" खोजने "के लिए अग्रणी पट्टी करें?


140
find . -type f -print

प्रिंट करता है

./file1
./file2
./file3

इसे प्रिंट करने का कोई भी तरीका

file1
file2
file3

?


1
यदि आप -exec /path/to/myscript.sh {} अपने में इस्तेमाल किया find, -printf '%P\n'काम नहीं करता है। इसके बजाय, मुझे ./स्क्रिप्ट के अंदर उपसर्ग p=${1#"./"}
चूमना होगा

यदि आप इसे केवल एक फ़ाइल के लिए कर रहे हैं:f=`find . -name migration`; echo ${f/.\//}
मास्टरएक्सिलो

जवाबों:


38

यदि वे केवल वर्तमान निर्देशिका में हैं

find * -type f -print

क्या तुम यही चाहते हो?


21
यह उन नामों से फ़ाइलों को याद करेगा जो एक अवधि से शुरू होते हैं।
सीन

2
खराब, शेल सेटिंग्स के आधार पर * "छिपी" फाइलों / निर्देशिकाओं का मूल्यांकन नहीं कर सकते हैं - जो डॉट (।) के साथ शुरू होते हैं, इस कमांड को अपने होम डायर में चलाने की कोशिश करें, फिर बस "खोज-करें f" और अंतर देखें ।
इलिया के।

35
एक अधिक प्रासंगिक चिंता यह है कि '*' का मूल्यांकन शेल द्वारा किया जाता है। आपके पास प्रभावी रूप से एक प्रकार की दुर्भावनापूर्ण कोड इंजेक्शन स्थिति है। यह '--exec rm' नाम की एक फ़ाइल बनाने के लिए और 'zzzz' नाम की एक अन्य चीज़ होगी। अलविदा फाइलें।
सीडब्ल्यूएफ

6
यह असुरक्षित है। यदि फ़ाइल नाम डैश से शुरू होता है, तो इसे खोजने के विकल्प के रूप में माना जाएगा, और विफल हो सकता है, या संभवतः नुकसान पहुंचा सकता है।
डेल एंडरसन

4
क्यों -printआवश्यक है? इसने उस झंडे के बिना ही परिणाम दिया।
user13107

239

वर्तमान निर्देशिका के अंतर्गत केवल नियमित फ़ाइलें खोजें, और उन्हें " ./" उपसर्ग के बिना प्रिंट करें :

find -type f -printf '%P\n'

आदमी खोजने से, -printfप्रारूप का वर्णन :

% P फाइल का नाम कमांड लाइन तर्क के नाम के साथ जिसके तहत उसे हटाया गया था।


18
+1 अच्छा समाधान यदि आपके findसमर्थन का संस्करण है -printf(सभी नहीं करते हैं)।
टोड ओवेन

2
जैसा कि टॉड ने कहा, लेकिन अधिक सटीक: यह POSIX 7. नहीं है
Ciro Santilli 郝海东 but but but

8
समर्थित या नहीं, यह निश्चित रूप से स्वीकृत उत्तर की तुलना में सुरक्षित है।
डेल एंडरसन

10
यदि आप इसे पाइप करना चाहते हैं \0, \nतो आप इसके स्थान पर उपयोग कर सकते हैं xargs -0(उदाहरण के लिए फ़ाइल नाम find -type f -printf '%P\0' | xargs -0 head
व्हाट्सएप में

1
@ क्यूंग्लॉन्ग, यह मैकओएस पर काम करता है यदि आप brew install findutils;)
ब्लॉकबोलॉप

58

सेड का प्रयोग करें

find . | sed "s|^\./||"

2
यह मेरा पसंदीदा समाधान है; यह POSIX- संगत है (व्यावहारिक रूप से हर जगह काम करता है, यहां तक ​​कि एम्बेडेड सिस्टम), बहुत कम, और अप्रत्याशित व्यवहार के परिणामस्वरूप होने की संभावना नहीं है। यह स्वीकृत उत्तर होना चाहिए।
जोडी ब्रूचोन

6
इसे किस तरह से जोड़ा जाएगा find -exec?
पॉल विंट्ज़

find -exec sh -c "echo {} | sed 's|^\./||'" \; या find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

यह छोटा हो सकता है

find * -type f

2> /dev/nullखाली निर्देशिका में कमांड चलने पर त्रुटि की अनदेखी करने से बेहतर है ।
नीवेक

2

अलग करना का एक अन्य तरीका ./का उपयोग करना है cutजैसे:

find -type f | cut -c3-

आगे स्पष्टीकरण यहाँ पाया जा सकता है


2

स्ट्रिपिंग का दूसरा तरीका

find * -type d -maxdepth 0

हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
डेविड बक

2

चूंकि -printfOSX पर विकल्प उपलब्ध नहीं findहै, इसलिए एक ऐसा आदेश है जो OSX खोज पर काम करता है, बस अगर कोई व्यक्ति आदि gnu findका उपयोग नहीं करना चाहता है, तो यह है brew:

find . -type f -execdir printf '%s\n' {} + 

1
दुर्भाग्य से यह इंटरमीडिएट सबडायरेक्टरीज सहित प्रत्येक मिली फ़ाइल के पूरे पथ को स्ट्रिप्स करता है, और केवल फ़ाइल नाम को प्रिंट करता है।
पीएलएल

1
तुम सही हो। यह समाधान केवल वर्तमान निर्देशिका में फ़ाइलों के लिए अच्छा है। नेस्टेड फ़ाइलों के लिए हमें उपयोग करने की आवश्यकता है:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
शुभ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.