क्या 'ls' कमांड से फोल्डर प्रीफिक्स को हटाना संभव है


12

मैं एक बैश स्क्रिप्ट में हूं और मैं सभी फाइलों की सूची प्राप्त करना चाहता हूं (सभी जार फाइलें कहते हैं)। मैं कमांड निष्पादित करता ls -1 lib/*.jarहूं और मुझे आउटपुट मिलता है:

lib/mylib_1.jar
lib/mylib_2.jar
...

क्या निम्न आउटपुट के लिए कोई विकल्प है:

mylib_1.jar
mylib_2.jar
...

cd libपहले बनाना एक विकल्प नहीं है क्योंकि मैं एक पाश में हूं और उन कार्यों के लिए मूल फ़ोल्डर में रहने की आवश्यकता है जो मैं पाश के अंदर करना चाहता हूं।

मैंने टाइप करके जानकारी खोजने की कोशिश की man lsलेकिन मुझे कोई हल नहीं मिला।

एक और कमांड के साथ एक समाधान अच्छा होगा जब तक मैं इसे अपने lsकमांड या आत्मनिर्भर के लिए पाइप कर सकता हूं ।


आप उन फाइलों के नाम के साथ क्या कर रहे हैं? क्या आप उन्हें केवल टर्मिनल पर सूचीबद्ध कर रहे हैं, या आप उन्हें किसी अन्य प्रोग्राम या स्क्रिप्ट (व्यक्तिगत रूप से या सूची के रूप में) में भेज रहे हैं? इसे संभालने का सही तरीका इस बात पर निर्भर करता है कि फाइलनेम का उपयोग कैसे किया जाता है।
कुसलानंद

एक बहु-मॉड्यूल जावा परियोजना पर तीसरे पक्ष के काम के बारे में कुछ आँकड़े करने का विचार था। मैं सिर्फ सूची चाहता था और बाद एक तरह से और uniq बनाने
рüффп

जवाबों:


19

पार्सिंग ls केfind बजाय आपको इसके बजाय का उपयोग करना चाहिए । फिर आप basenameप्रत्येक फ़ाइल पर प्रमुख निर्देशिकाओं को हटाने के लिए निष्पादित कर सकते हैं :

find lib/ -name '*.jar' -exec basename {} \;

ठीक है यह तरीका मेरे लिए भी सही है।
рüффп

3
-maxdepthविकल्प भी देखें ।

13

जीएनयू के साथ हर एक फाइल findको चलाने की कोई जरूरत नहीं है basename, यह बहुत तेज होगा (खासकर अगर बहुत सारी फाइलें हैं):

find lib -name '*.jar' -printf '%P\n'

11

कैसे के बारे में (cd lib && echo *.jar), यह मानते हुए कि आपके पास फ़ाइल नामों में व्हाट्सएप या विशेष वर्ण नहीं हैं। पैरेंट स्क्रिप्ट कभी डायरेक्टरी नहीं बदलती।


रिक्त स्थान भी एक मुद्दा नहीं होगा।
terdon

यह एक अच्छा विचार है और संभवतः सबसे तेज़ विकल्प होगा। मैं printf '%s\n' *.jarहालांकि हर फाइल को एक अलग लाइन पर लाने के लिए करूंगा ।
ग्रीम

या यहां तक ​​कि printf '%s\0' *.jarव्हाट्सएप मुद्दों को खत्म करने के लिए (हालांकि यह क्यू नहीं है)।
ग्रीम

5

जैसा कि जोश जॉली ने अपने जवाब में कहा था, आपको कभी भी पार्स नहीं करना चाहिए ls, उसके जवाब में दृष्टिकोण का उपयोग करें। फिर भी, यहाँ awkफ़ाइल नामों से पथ निकालने का एक उपाय है, बस इसे ls के साथ प्रयोग न करें:

find . | awk -F'/' '{print $NF}'

-F'/'सेट क्षेत्र विभाजक के लिए /जिसका अर्थ है कि पिछले क्षेत्र, $NF, नाम होगा।


1

findशायद जाने का रास्ता है, लेकिन अगर आप वास्तव में, वास्तव में करते हैं (आप नहीं) lib/से दूर करना चाहते हैं ls -1, तो आप उपयोग कर सकते हैं sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

आप इस का उपयोग कर सकते xargs एक --max-आर्ग के साथ (या कम उर्फ एन) पैरामीटर:

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

ध्यान दें कि हम --quoting-style=cफ़ाइलनामों में सुनिश्चित स्थान बनाने के लिए उपयोग करते हैं xargs खराब न करें।


मैंने उस पर ध्यान नहीं दिया। धन्यवाद! इस रत्न को एक अन्य स्टैक एक्सचेंज में मिला। आप उद्धरणों को ls परिणामों से जोड़ सकते हैं --quoting-style = c। तो परिणामी पूर्ण कमांड होगी: `ls --quoting-style = c -1 lib / *। Jar | xargs --max-args 1 basename`
yoni

-1

अपनी क्वेरी को हल करने का एक वैकल्पिक तरीका सभी फ़ाइलों का उपयोग करके सूचीबद्ध करना है ls -R। केवल .jar फ़ाइलों की सूची के लिए grep के साथ ls कमांड के आउटपुट को मिलाएं। आप अपनी क्वेरी के लिए ऐसा करने के लिए निम्न आदेश का उपयोग कर सकते हैं:

ls -R lib | grep jar| grep -v jar*

यह बुरी तरह से विफल होता है अगर वहाँ एक उपनिर्देशिका होती है जिसमें जार फाइलें भी होती हैं, या उदाहरण के लिए "लिस्ट-ऑफ-जार्स.नेट" नामक एक फ़ाइल।
जूल्स

grep -v जार * आपके उद्धृत उदाहरण की तरह फ़ाइल के साथ परिणामों को फ़िल्टर करेगा।
joshi.mohit86

सच। यह सभी इच्छित फ़ाइलों को फ़िल्टर भी करेगा। अब मैं इसे फिर से देखता हूं, मैं कोई भी परिस्थिति नहीं देख सकता हूं जहां आप जो सुझाव देते हैं वह वास्तव में बिल्कुल भी किसी भी उत्पादन का उत्पादन करेगा ...
जूल्स

नहीं, यह फ़ाइलों की तरह प्रदर्शित करेगा mylib_2.jarऔर फ़ाइलों को फ़िल्टर करना पसंद करेगा list-of-jars.txt
joshi.mohit86

नहीं, यह नहीं है। मैंने बस कोशिश की। find development -name '*.jar' | wc -l-> 70ls -R development | grep jar| grep -v jar*-> कोई आउटपुट नहीं।
जूल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.