वर्तमान निर्देशिका में केवल नियमित फ़ाइलें (लेकिन निर्देशिका नहीं) सूचीबद्ध करें


126

मैं ls -ld */वर्तमान निर्देशिका में सभी निर्देशिका प्रविष्टियों को सूचीबद्ध करने के लिए उपयोग कर सकता हूं । क्या वर्तमान निर्देशिका में सभी नियमित फ़ाइलों को सूचीबद्ध करने का एक समान आसान तरीका है? मुझे पता है कि मैं खोज का उपयोग कर सकता हूं

find . -maxdepth 1 -type f

या स्टेट

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

लेकिन ये मुझे बहुत खूबसूरत होने के नाते हड़ताल नहीं करते हैं। क्या केवल नियमित फ़ाइलों को सूचीबद्ध करने का एक अच्छा छोटा तरीका है (मुझे डिवाइस, पाइप, आदि की परवाह नहीं है) लेकिन वर्तमान निर्देशिका के उप-निर्देशिका नहीं हैं? प्रतीकात्मक लिंक को सूचीबद्ध करना एक प्लस होगा, लेकिन एक आवश्यकता नहीं है।


5
"अति सुंदर" से आपका क्या तात्पर्य है? जहाँ तक मुझे पता है, findकमांड वही है जो आप करना चाहते हैं। कुछ विश्वसनीय अन्य विकल्पों के लिए, आपको शेल विशिष्ट कमांड (और वे कुछ भी लेकिन पोर्टेबल हैं) में देखना चाहिए!
रहमू

@ इर्मू मैं कुछ ऐसी ही चीज़ों के लिए थी ls -d */, जो छोटी, टाइप करने में आसान और समझने में आसान है। इसलिए मैं उलरिक डांगेल के जवाब से बहुत खुश हूं, भले ही मैं zsh का उपयोग नहीं कर रहा हूं।
daniel kullmann

जवाबों:


32

साथ zshऔर ग्लोब क्वालिफायर आप आसानी से इसे सीधे व्यक्त कर सकते हैं, जैसे:

echo *(.)

या तो केवल नियमित फ़ाइलों की सूची या आपके कॉन्फ़िगरेशन के आधार पर एक त्रुटि वापस करेगा।

गैर-निर्देशिकाओं के लिए:

echo *(^/)

(सिमिलिंक (निर्देशिकाओं सहित), नामित पाइप, उपकरण, सॉकेट, दरवाजे ... शामिल होंगे)

echo *(-.)

नियमित फ़ाइलों के लिए और नियमित फ़ाइलों के लिए सहानुभूति।

echo *(-^/)

गैर-निर्देशिकाओं के लिए और निर्देशिकाओं के लिए कोई सहानुभूति नहीं।

इसके अलावा, Dग्लोबिंग क्वालिफायर देखें अगर आप डी ओटी फाइलों (छिपी हुई फाइलों) को शामिल करना चाहते हैं , जैसे *(D-.)


170
ls -p | grep -v / 

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

यह मानता है कि फ़ाइलों में से कोई भी उनके नाम में newline वर्ण नहीं है। -qकरने के लिए एक विकल्प जोड़ना lsnewline सहित सभी गैर-मुद्रण योग्य वर्णों को रूपांतरित करेगा ?, यह गारंटी देता है कि वे एक पंक्ति में हैं और एक लाइन-आधारित उपयोगिता को खिलाने के लिए उपयुक्त हैं जैसे कि grepऔर टर्मिनल पर मुद्रण के लिए।


14
+1, यह एक अच्छा जवाब है। बिना किसी टिप्पणी के एक नए उपयोगकर्ता को वोट देना मेरे लिए बहुत चौंकाने वाला है, खासकर जब एक काम का जवाब दिया जाता है। एकमात्र किनारे का मामला मैं देख सकता हूं कि यह कहां ठीक से काम नहीं करेगा यदि फ़ाइल नाम में कोई नई रेखा है। साथ ही रंगों को बनाए रखना एक अच्छा परिवर्धन होगा जहां समर्थित है। जीएनयू के लिए आप जोड़ सकते हैं --color=alwaysकरने के लिए lsOSX के लिए, -G
ग्रीम

नमस्ते, आपके द्वारा दी गई कमांड बढ़िया है और यह निश्चित रूप से मेरी मदद करती है लेकिन मैं सोच रहा था कि क्या उपरोक्त कमांड का उपयोग करना संभव है और एक ही समय में फ़ाइल अनुमति को बदलना है? मैंने sudo chmod 777अंत में जोड़ने की कोशिश की , और मुझे त्रुटियां दी
गईं

3
यदि आप भी निर्देशिका को इंगित करने वाले सिम्लिंक को बाहर करना पसंद करते हैं ls -pL | grep -v /। जोड़ा -Ldereferences प्रतीकात्मक लिंक।
मथियास ब्रौन

1
यदि आपका वाइल्डकार्ड फ़िल्टर का उपयोग करना पसंद करता है, तो करें ls -pdL something* | grep -v /। जोड़ा गया -dविकल्प स्वयं निर्देशिकाओं को सूचीबद्ध करता है, उनकी सामग्री को नहीं, इसलिए उन्हें सही ढंग से बाहर रखा जाएगा।
रॉकलाइट

और अगर आप फ़ोल्डरों के बिना सभी फ़ाइलों को हड़पना चाहते थे, तो सिर्फ -v
जसोनलोनहार्ड

23

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

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

15

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

(नोट: फ़ंक्शन और उपनामों के साथ कुछ गुंजाइश मुद्दे हैं। लिपियों को किसी भी निष्पादन योग्य के लिए उपलब्ध है जो उन्हें पढ़ और निष्पादित कर सकते हैं। उपनाम और फ़ंक्शन केवल वर्तमान शेल में उपलब्ध हैं - हालांकि एक उप-शेल का .profile / .bashy आदि फिर से परिभाषित कर सकते हैं। उन्हें और इस तरह उन्हें उपलब्ध कराएँ। इसके अलावा, एक स्क्रिप्ट किसी भी भाषा में लिखी जा सकती है - जिसमें बैश / श, अज़, पर्ल, पाइथन, और अन्य शामिल हैं - जो भी नौकरी के लिए सबसे अच्छा है या जिसे आप सबसे अधिक परिचित हैं)

जैसे

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

मैंने xargs जोड़ा है ताकि आप सभी सामान्य lsविकल्पों का उपयोग कर सकें , जैसेlsf -lrS

क्योंकि यह उपयोग करता है find, सामान्य रूप से छिपे हुए सभी डॉटफाइल्स प्रदर्शित किए जाएंगे, और सभी फ़ाइलनाम के साथ उपसर्ग किया जाएगा ।/ - यह एकमात्र अंतर है जिसके बारे में आप ध्यान देंगे।

आप डॉट फ़ाइलों को छोड़ सकते हैं, ! -iname '.*'लेकिन तब आपको उपनाम के दो संस्करण होने चाहिए - एक जो कि डॉट फाइलें प्रदर्शित करता है और एक ऐसा नहीं है।

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

वैकल्पिक रूप से, यदि lsfएक स्क्रिप्ट के बजाय एक उपनाम था तो आप विकल्पों को पार्स कर सकते हैं (शायद गेटटॉप या / usr / बिन / गेटटॉप या समान के साथ), और डॉटफाइल्स को तब तक बाहर रखें जब तक -aकि मौजूद न हो।


-nameपर्याप्त है, तो आप की जरूरत नहीं है -iname
टॉटर

8
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

-F विकल्प ls के लिए * निष्पादन योग्य, / से निर्देशिकाओं, @ को प्रतीकात्मक लिंक, = सॉकेट के लिए, और; FIFO के लिए। आप आउटपुट से गैर-नियमित फ़ाइल वर्णों को बाहर करने के लिए grep का उपयोग कर सकते हैं और आपके पास फ़ाइलें हैं। यह किसी भी शेल में काम करेगा, सिर्फ zsh नहीं।

कमजोरियां हैं:

  1. कोई भी फ़ाइल जिसका नाम समाप्त होता है @, =या |बाहर रखा जाएगा (लेकिन आपके पास वास्तव में नाम में उन वर्णों वाली फ़ाइलें नहीं होनी चाहिए)
  2. यह दरवाजे जैसी कुछ प्रणालियों पर डिवाइस फ़ाइलों या कुछ विदेशी प्रकार की फ़ाइलों को बाहर नहीं करता है।
  3. आपके पास निष्पादन योग्य किसी भी फ़ाइल पर एक तारांकित जोड़ा जाएगा। आउटपुट से किसी भी '*' वर्ण को हटाने के लिए सेड के माध्यम से पाइपिंग द्वारा इसे संभाला जा सकता है।
  4. यदि ठीक से काम नहीं करता है तो फ़ाइल नाम में नईलाइन वर्ण होते हैं।

सिस्टम पर मैं यह लिख रहा हूं, 10% फाइलों में नाम हैं =, @या |वर्ण हैं। =maildir या फ़ाइलनाम में आम है जिनका बेस 64 या उद्धृत-प्रिंट करने योग्य एन्कोडेड भाग है। @ईमेल पते और अधिक के लिए स्थानीय परिभाषाओं में। हालांकि उनके लिए फ़ाइल नाम के अंत में दिखाई देना दुर्लभ है। (उदाहरण के लिए इस प्रणाली पर 2.2 करोड़ में से केवल 31)
स्टीफन चेज़लस

3

मैनुअल ने कहा कि 'एफ' विकल्प केवल 'नियमित फाइल' के खिलाफ है, न कि पाइप, सॉकेट या ब्लॉक / चार डिवाइस, जिसका मतलब है कि आप पहले से ही सही सामान कर रहे हैं।

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)

0

यह विशेष रूप से छोटा नहीं है, लेकिन यदि आप इसे जल्दी से कॉल करने की आवश्यकता है, तो आप इसे स्क्रिप्ट या उपनाम में बदल सकते हैं। इनपुट कमांड के रूप में ls कमांड का उपयोग करते हुए, null को भेजे गए आउटपुट के साथ डायरेक्टरी को बाहर करने के लिए grep को पाइप किए गए प्रत्येक प्रविष्टि पर ls -ld को कॉल करें, और यदि सफल मूल इनपुट को इको करें।

for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;

आप grep और सशर्त आउटपुट को उल्टा कर सकते हैं, वही परिणाम:

for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;

\dev\null?!?!
मैनटवर्क


0

यह थोड़ा पुराना धागा है, लेकिन केवल फाइलों को सूचीबद्ध करने का सबसे साफ तरीका है।

ls -al | grep '^-' | awk '{print $9}'


1
touch "some file name"एक त्वरित counterexample को देखने के लिए
जेफ स्कालर

@JeffSchaller आपके पास एक वैध बिंदु है। उसके लिए कुछ इस तरह। ls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }', उन में रिक्त स्थान के साथ फ़ाइलों को संभालना चाहिए।
RJ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.