उस निर्देशिका में उपनिर्देशिका और उनकी सामग्री को सूचीबद्ध किए बिना एक निर्देशिका में फ़ाइलों को सूचीबद्ध करना


24

मैं एक निर्देशिका में सभी फ़ाइलों की एक सूची बनाना चाहता हूं, जो कि उसी निर्देशिका में रहने वाले किसी भी उपनिर्देशिका को सूचीबद्ध किए बिना, और उस सूची को एक नई फ़ाइल में प्रिंट कर सकता है।

ls -d * > filelist

वर्तमान निर्देशिका में सभी फ़ाइलों की एक सूची बनाएगा, लेकिन यह वर्तमान निर्देशिका में उपनिर्देशिकाओं को भी सूचीबद्ध करता है। मैंने विकल्प findका उपयोग करके कमांड की कोशिश की -maxdepth 1- हालांकि, आउटपुट स्वरूप एक समस्या है क्योंकि फ़ाइल नामों के साथ पथ को प्रिंट करने का भी पता चलता है।

अगर कोई मुझे बता सकता है कि शायद एक और कमांड या विकल्प का उपयोग करें जो एक डायरेक्टरी में सिर्फ फाइलों की एक आउटपुट सूची का उत्पादन करेगा और उपनिर्देशिकाओं या उनकी सामग्री के नाम नहीं, मैं इसकी सराहना करूंगा।


2
मुझे भ्रम है कि ls -d *केवल वर्तमान फ़ोल्डर में फ़ाइलों और फ़ोल्डरों की सूची यहां छिपा हुआ फ़ाइलों / फ़ोल्डरों को छोड़कर;
GM-Script-Writer-62850

हां, लेकिन मैं नहीं चाहता कि उस डायरेक्टरी में फोल्डर लिस्टेड हों, केवल उस डाइरेक्टरी की फाइल्स लिस्टेड हों
जेनेट

जवाबों:


22

हल-आधारित समाधान:

find . -maxdepth 1 -type f -printf '%f\n'

बैश-आधारित समाधान:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

बैश-आधारित समाधान आपको वह सब कुछ मिलेगा जो निर्देशिका नहीं है; इसमें नामित पाइप जैसी चीजें शामिल होंगी (आप शायद यही चाहते हैं)। यदि आप विशेष रूप से केवल फाइलें चाहते हैं , तो findकमांड का उपयोग करें या इनमें से एक:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

यदि आप नियमित रूप से इसका उपयोग करने जा रहे हैं, तो आप निश्चित रूप से इसे अपने उपनाम में कहीं और डाल सकते हैं ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

चूंकि आपने टिप्पणियों में नोट किया है कि आप वास्तव में उबंटू के बजाय ओएसएक्स पर हैं, तो मैं सुझाव दूंगा कि अगली बार जब आप Apple या अधिक सामान्य यूनिक्स और लिनक्स स्टैक एक्सचेंज साइटों पर सवाल पूछें ।


1
यह जांचना सुनिश्चित करें कि ये समाधान आपके लिए सही हैं कि आप छिपी हुई फ़ाइलों को शामिल करना चाहते हैं या नहीं।
केविन व्हीलर

10

केवल फ़ाइल नाम सूची:

1. ls -p | grep -v / (बिना छुपी फाइलें)
 2. ls -l | grep ^ - | tr -s '' | कट -d '' -f 9 (छिपी फ़ाइलों के बिना)

 a) ls -pa | grep -v / (छुपी हुई फ़ाइलों के साथ)
 b) ls -ला | grep ^ - | tr -s '' | कट -d '' -f (छिपी फाइलों के साथ)

सूची निर्देशिका केवल:

1. ls -p | grep / (छिपे बिना)
 2. ls -l | grep ^ d | tr -s '' | कट -d '' -f 9 (बिना छिपा हुआ)

 a) ls -pa | grep / (छिपे हुए के साथ)
 b) ls -l | grep ^ d | tr -s '' | कट -d '' -f 9 (छिपे हुए)

grep -v -e ^ $ परिणाम से रिक्त लाइनों को हटाने के लिए है।

अधिक जानकारी :
ls -p ध्वज को निर्देशिका नाम के अंत में '/' रखना है, -R ध्वज पुनरावर्ती खोज के लिए है, -l जानकारी के साथ लिस्टिंग के लिए, -a सभी जानकारी (छिपी हुई फ़ाइलों सहित) के लिए जानकारी के साथ, grep -v झंडा परिणाम उल्टे के लिए है और -e झंडा regex मिलान के लिए है।


7

केवल नियमित फ़ाइलों को सूचीबद्ध करने के लिए:

ls -al | grep ^-

प्रतीकात्मक लिंक के साथ शामिल हैं:

ls -al | grep ^[-l]

जहां सूची का पहला वर्ण फ़ाइल के प्रकार का वर्णन करता है, तो -इसका मतलब है कि यह एक नियमित फ़ाइल है, प्रतीकात्मक लिंक के लिए l

Debian / Ubuntu

सभी मिलान फ़ाइलों के नाम प्रिंट करें (लिंक सहित):

run-parts --list --regex . .

पूर्ण पथ के साथ:

run-parts --list --regex . $PWD

इसके /etcसाथ शुरू pऔर अंत में सभी फाइलों के नाम प्रिंट करें d:

run-parts --list --regex '^p.*d$' /etc

5

फिर भी एक और समाधान, एक भोला छोटा कि मेरे लिए काम किया:

ls -la | grep -E '^[^d]' > files

मेरे लिए बिल्कुल सही,ls -alR |grep -E '^-'
यहाँ

4

मैं खोज का उपयोग करने का सुझाव दूंगा और यदि आवश्यक हो तो उत्पादन से निर्देशिका नाम को हटा दें:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1किसी भी फ़िल्टर से पहले आना चाहिए, और आप विकल्प के sedसाथ उपयोग किए बिना इस परिणाम को प्राप्त कर सकते हैं -printf, अर्थात: find . -maxdepth 1 -type f -printf '%f\n'(यह एक अतिरिक्त कार्यक्रम का उपयोग करने की तुलना में अधिक कुशल होगा)।
evilsoup

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

एक और संभावित विकल्प है

ls -F | grep -v '/' | sed /[@*]$// > filelist

--file-typeफ़ोल्डर (लेकिन यह भी सांकेतिक लिंक की। अंत में @ के अंत में डालता है एक / The grep -v '/'उपनिर्देशिका को हटा (क्योंकि वे अब के साथ समाप्त एक '/')। sed s/@$//निकालता है कि @। -1 प्रिंट एक प्रति पंक्ति फ़ाइल ताकि grep -v सही ढंग से काम करे।


आपकी प्रतिक्रिया के लिए धन्यवाद। दुर्भाग्य से, यह मेरे लिए काम नहीं कर रहा है, शायद मैं इसे गलत तरीके से निष्पादित कर रहा हूं। अगर मैं आपको दी गई सटीक कमांड का उपयोग करता हूं, तो मुझे निम्न त्रुटि मिलती है: ls: अवैध विकल्प - उपयोग: ls [-ABCFGHLPRSTWabcdefghiklmlmnopqrstuwx1] [फ़ाइल ...] मैंने * वाइल्डकार्ड वर्ण का उपयोग करने के साथ-साथ उसके स्थान पर भी उपयोग करने का प्रयास किया। --file- प्रकार के साथ संयोजन। अगर आप स्पष्ट कर सकते हैं तो मैं इसकी सराहना करूंगा!
जेनेट

कमांड मेरे लिए काम करता है (13.04 चल रहा है), आप किस संस्करण का उपयोग कर रहे हैं ?; -1कोई फर्क नहीं पड़ता कि आपको इसकी आवश्यकता नहीं है; यदि आप छिपी हुई फ़ाइलों को शामिल करना चाहते हैं, तो -aविकल्प का उपयोग करेंls
GM-Script-Writer-62850

वास्तव में, मैं एक पर काम कर रहा हूँ MAC। शायद मैक ओएस एक्स या यूनिक्स पर कमांड थोड़ा अलग है?
जेनेट

1
आप यह भी कोशिश कर सकते हैंls -F | grep -v '/' | sed s/[@*]$// > filelist
डॉ.टावर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.