निर्देशिका के सापेक्ष "खोज" आउटपुट


34

मैं findएक cpioऑपरेशन के लिए दिए गए रूट में सभी फ़ाइलों और निर्देशिकाओं को पुनरावर्ती रूप से सूचीबद्ध करने के लिए उपयोग करना चाहूंगा । हालाँकि, मैं नहीं चाहता कि रूट डाइरेक्टरी स्वयं पथों में दिखाई दे। उदाहरण के लिए, मुझे वर्तमान में:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

लेकिन, मैं प्राप्त करना चाहूंगा

file1
dir1
dir1/file2

(ध्यान दें कि रूट मेरे वांछित आउटपुट में नहीं है, लेकिन इससे छुटकारा पाना आसान है tail)।

मैं OS X पर हूं, और यदि संभव हो तो किसी भी अतिरिक्त टूल (जैसे GNU खोज) को स्थापित नहीं करना चाहूंगा, क्योंकि मैं उस स्क्रिप्ट को साझा करना चाहूंगा जिसे मैं अन्य OS X उपयोगकर्ताओं के साथ लिख रहा हूं।

मुझे पता है कि यह cutरूट लिस्टिंग को काट देने के साथ किया जा सकता है , लेकिन ऐसा लगता है कि यह एक सबॉप्टीमल सॉल्यूशन है। क्या कोई बेहतर उपाय उपलब्ध है?


find diskimg/* | cut -d '/' -f2-
nik.shornikov

जवाबों:


18

यदि आप जो करने की कोशिश कर रहे हैं वह बहुत जटिल नहीं है, तो आप इसे सेड के साथ पूरा कर सकते हैं:

find diskimg | sed -n 's|^diskimg/||p'

या cut:

find diskimg | cut -sd / -f 2-

आप कमांड के लिए (लगभग) किसी भी विभाजक को चुन सकते हैं, इसलिए: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(ध्यान दें मैंने '-E ’भी जोड़ा है, और एक ^अच्छा अभ्यास है (यहाँ आवश्यक नहीं है, जैसा कि आप सुनिश्चित हैं कि हर पंक्तियों में यह होगा ... लेकिन अभी भी अच्छा अभ्यास है) , और कुछ सीपीयू बचाता है;))
ओलिवियर दुलाक

grep के बिना एक और तरीका: find diskimg | sed -e 's|^diskimg/*||' ('/' '' / 'की किसी भी संख्या से मेल खाएगा, यहां तक ​​कि 0)
ओलिवियर दुलैक

यह cutकमांड मेरे द्वारा उपयोग किए जाने की तुलना में क्लीनर है; मुझें यह पसंद है। ( sedसमाधान भी अच्छा है, लेकिन की पुनरावृत्ति diskimg/थोड़ा दुर्भाग्यपूर्ण है)।
nnonneo

30

cd पहले निर्देशिका में:

cd diskimg && find . 

पूरा होने पर, आप अपनी मूल निर्देशिका में वापस आ जाएंगे।

आपकी फाइलें इस मामले में / के साथ पहले से चलेंगी; एकमात्र तरीका जो मैं देख रहा हूँ कि इसका उपयोग किया जाएगा cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

अपने शेल की वर्तमान निर्देशिका को बदलने से बचने के लिए एक उपधारा का उपयोग करें (यह आवश्यक नहीं है यदि आप आउटपुट को पाइप कर रहे हैं क्योंकि पहले से ही एक उप-भाग में पाइप के बायीं ओर स्थित है)।

(cd diskimg && find .)

5
पूरा होने पर मूल dir में वापस आना: कोष्ठक जोड़ना (cd diskimg && find . ; ):। इस तरह से cd diskimg && find .एक सबशेल में किया जाता है: जब वह सबस्क्रिप्शन बाहर निकलता है तो आप अपने स्वयं के शेल में वापस आ जाते हैं, जो भी डायरेक्टरी में थे।
ओलिवियर दुलक

1
find *बेकार उपसर्ग के आसपास एक और तरीका है
nik.shornikov

23

एक और, अधिक जटिल लेकिन केवल मेरे अन्य उत्तर से दृष्टिकोण का उपयोग करके:

find diskimg -mindepth 1 -printf '%P\n'

findसमर्थन के सभी संस्करण नहीं printf
jordanm

1
निश्चित रूप से, मेरा OSX नहीं है, ऐसा लगता है। आंशिक रूप से मैंने एक और समाधान क्यों पेश किया।
Stephan

2
@ स्टेफ़न - अगली बार आप इन प्रकार के उत्तरों को एक ही में जोड़ सकते हैं। इस तरह के रूपांतरों के लिए कई उत्तर देने की आवश्यकता नहीं है।
SLM

2
केवल GNU findसमर्थन करता है -printf, जबकि कई BSD findने GNU की कुछ विशेषताओं की findनकल की है, किसी ने भी -printfअभी तक कॉपी नहीं किया है (AFAIK)।
स्टीफन चेज़लस

%Pरिश्तेदार पथ के लिए मैं क्या जरूरत थी।
Fl0v0

4

realpathउपयोगिता का उपयोग करें :

find diskimg -exec realpath --relative-to diskimg {} \;

नीट - मुझे दिखाने के लिए धन्यवाद --relative-to
nnonneo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.