केवल फाइलों को कैसे सूचीबद्ध करें और एक निर्देशिका बैश की निर्देशिका नहीं?


87

मैं एक फ़ोल्डर की सभी फाइलों को कैसे सूचीबद्ध कर सकता हूं लेकिन उनके फ़ोल्डरों या सबफाइल्स को नहीं। दूसरे शब्दों में: मैं केवल फाइलों को कैसे सूचीबद्ध कर सकता हूं?




प्रस्तावित डुप्लिकेट में से कोई भी निर्देशिका को हटाने की आवश्यकता को लागू नहीं करता है।
ट्रिपलआई

जवाबों:


118

का उपयोग कर find:

find . -maxdepth 1 -type f

-maxdepth 1विकल्प का उपयोग करना सुनिश्चित करता है कि आप केवल वर्तमान निर्देशिका में देखते हैं (या, यदि आप .किसी पथ के साथ प्रतिस्थापित करते हैं, तो वह निर्देशिका)। यदि आप उस और उपनिर्देशिका में सभी फ़ाइलों की पूर्ण पुनरावर्ती सूची चाहते हैं, तो बस उस विकल्प को हटा दें।


Mklement0 के उत्तर के लिए मेरी टिप्पणी के बाद, मुझे एहसास हुआ कि "खोजो ।/*.png -maxdepth 1 -type f> pngs.txt" शायद वही पूरा करेगा। ऐसा होता है। एक स्क्रिप्ट स्थापित किए बिना।
एलेक्स हॉल

2
findमैक पर, न तो विकल्प हैं -type, न ही -maxdepthविकल्प।
तिमोफ़े

1
@Tim: -typeऔर -maxdepthनहीं कर रहे हैं विकल्प सामान्य अर्थों में; बीएसडी find(जैसा कि ओएस एक्स पर उपयोग किया जाता है) उन्हें प्राइमरी कहता है , और उन्हें फ़ाइल नाम ऑपरेंड (एस) के बाद आना चाहिए ( .इस मामले में, ध्यान दें कि लिनक्स पर विपरीत, बीएसडी संस्करण को कम से कम एक स्पष्ट फ़ाइल नाम ऑपरेंड की आवश्यकता है); इस उत्तर में कमांड निश्चित रूप से एक मैक पर काम करता है।
mklement0

1
@AlexHall: यह एक चतुर समाधान है (हालांकि मैं सुझाव find *.png -maxdepth 0 -type fसे बचने के लिए ./उत्पादन फ़ाइल नामों में उपसर्ग, यह भी ध्यान रखें -maxdepthकी 0, नहीं 1) है, जब तक आप सभी की जरूरत फ़ाइल के रूप में नाम में वर्णमाला के क्रम । यदि आप चाहते हैं कि lsअन्यथा आप के लिए क्या कर सकते हैं (विभिन्न आउटपुट स्वरूप / आदेश, इनलाइन नियंत्रण इस बात पर कि क्या छिपी हुई वस्तुओं को शामिल किया गया है या नहीं), [मल्टी-] टाइप फ़िल्टरिंग के साथ पूरक, मेरे उत्तर से स्क्रिप्ट मदद कर सकता है।
mklement0

1
इसके विपरीत , उत्तर find * -maxdepth 0 -type fसे @ एलेक्सहॉल की टिप्पणी से लिया गया एक विकल्प find . -maxdepth 1 -type f: आमतौर पर find . ...इसमें छिपी हुई वस्तुएं शामिल होती हैं , आमतौर पर आउटपुट फ़ाइल नाम के साथ उपसर्ग ./और, जीएनयू find(लिनक्स) के साथ, आमतौर पर एक अनसुलझी सूची को आउटपुट करता है। find * ..., शेल को सामने की ओर ग्लोबिंग करने देने के कारण , डिफ़ॉल्ट रूप से छिपे हुए आइटम को छोड़कर (के साथ बदला जा सकता है shopt -s dotglob), आउटपुट मात्र फ़ाइलनाम (कोई उपसर्ग नहीं), वर्णानुक्रम में सॉर्ट किया गया। न तो दृष्टिकोण में फ़ाइलों के लिए सीमलिंक शामिल हैं ; -Lऐसा करने के लिए विकल्प का उपयोग करें।
mklement0

15
ls -p | grep -v /

ls -p आपको फ़ोल्डर के नाम के बाद / दिखाता है, जो आपको हटाने के लिए टैग के रूप में कार्य करता है।


यह अच्छा एक उदाहरण का उपयोग करते हुए देखने के लिए lsके अलावा find, बाद रिटर्न संबंधित पथ और पूर्व केवल फ़ाइल नाम के बाद से। इस काम के लिए सही उपकरण का उपयोग करें।
बेन एमोस

5
  • कारप्लेट- findआधारित उत्तर ( find . -maxdepth 1 -type f) सिद्धांत रूप में काम करता है, लेकिन इसका उपयोग करने के समान नहीं है ls: आपको सभी उपसर्गों के साथ फ़ाइलनामों की एक संभावित रूप से अनसुलझी सूची मिलती है , और आप कई विकल्पों को लागू करने की क्षमता खो देते हैं./ls ;
    भी find सदा ही पाता छिपा आइटम भी है, जबकि ls'व्यवहार उपस्थिति या के अभाव पर निर्भर करता है -aया -Aविकल्प।

    • एक सुधार , ने सुझाव दिया एलेक्स हॉल प्रश्न पर एक टिप्पणी में करने के लिए है गठबंधन खोल ग्लोबिंग साथfind :

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • हालाँकि, जब यह उपसर्ग समस्या को संबोधित करता है और आपको वर्णानुक्रम से सॉर्ट किए गए आउटपुट देता है , तब भी आपके पास छिपी हुई वस्तुओं को शामिल करने पर न तो (इनलाइन) नियंत्रण होता है और न ही lsकई अन्य छँटाई / आउटपुट-प्रारूप विकल्पों तक पहुँच होती है।
  • हंस रोजगमैन का ls+ grepउत्तर व्यावहारिक है, लेकिन आप लंबे ( -l) आउटपुट प्रारूप का उपयोग करते हुए लॉक कर देते हैं


इन सीमाओं को संबोधित करने के लिए मैंने fls( f iltering ls ) उपयोगिता लिखी ,

  • एक उपयोगिता जो टाइप-फ़िल्टरिंग क्षमता प्रदान करते हुए आउटपुट लचीलापनls प्रदान करती है ,
  • बस टाइप-फ़िल्टरिंग अक्षर जैसे कि fफ़ाइलों के लिए, dनिर्देशिकाओं के लिए, औरlls तर्क की सूची से पहले सहानुभूति रखने के लिए (रन fls --helpया fls --manअधिक जानने के लिए)।

उदाहरण:

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

इंस्टालेशन

समर्थित मंच

  • एनपीएम रजिस्ट्री से स्थापित करते समय : लिनक्स और मैकओएस
  • मैन्युअल रूप से इंस्टॉल करते समय : बैश के साथ कोई भी यूनिक्स जैसा प्लेटफॉर्म

से NPM रजिस्ट्री

नोट: यदि आप Node.js का उपयोग नहीं करते हैं, तो इसका पैकेज मैनेजर, npmप्लेटफार्मों पर काम करता है और इसे स्थापित करना आसान है; प्रयत्न
curl -L https://git.io/n-install | bash

स्थापित Node.js के साथ , निम्नानुसार स्थापित करें:

[sudo] npm install fls -g

नोट :

  • क्या आपको आवश्यकता sudoहै कि आप इस बात पर निर्भर करते हैं कि आपने Node.js / io.js को कैसे स्थापित किया है और क्या आपने बाद में अनुमतियां बदली हैं ; यदि आपको कोई EACCESत्रुटि मिलती है , तो फिर से प्रयास करें sudo

  • -gसुनिश्चित करता है वैश्विक स्थापना और डाल करने के लिए की जरूरत है flsअपने सिस्टम के में $PATH

मैनुअल स्थापना

  • इस bashलिपि को डाउनलोड करेंfls
  • इसके साथ निष्पादन योग्य बनाएं chmod +x fls
  • इसे स्थानांतरित करें या इसे अपने $PATHजैसे /usr/local/bin(macOS) या /usr/bin(लिनक्स) में एक फ़ोल्डर में सिमिलिंक करें ।

1
प्रतिभाशाली। भले ही इसमें दूसरी स्क्रिप्ट बनाना शामिल हो। मैंने आपके द्वारा लिंक किए गए सादे पाठ स्रोत से एक पाठ फ़ाइल में कॉपी और पेस्ट किया, और इसे Cygwin में इस आदेश के साथ चलाया: fls.sh f * .png> pngs.txt और बिंगो: .png फ़ाइलों की एक सूची। लेकिन वास्तव में, ls के पास DOS "dir / b" स्विच के लिए एक विकल्प नहीं है? मैंने ls '--help आउटपुट की सामग्री को देखा, और कुछ भी नहीं है, कम से कम।
एलेक्स हॉल

1
@AlexHall: धन्यवाद; tl; dr: try -1(नंबर एक); lsवास्तव में "नंगे" आउटपुट को डिफॉल्ट करता है, अर्थात, केवल फ़ाइल नाम, लेकिन जब टर्मिनल पर आउटपुट एक कॉलम-आधारित लेआउट (प्रति पंक्ति कई फ़ाइल नाम) का उपयोग करता है। प्रति आउटपुट लाइन में एक फ़ाइल नाम प्राप्त करने के लिए (जो कि क्या dir /bकरता है, यदि मेमोरी कार्य करता है), -1विकल्प का उपयोग करें , जो वास्तव में अंतर्निहित है जब stdout एक टर्मिनल से जुड़ा नहीं है , जैसे कि पाइप या आउटपुट फ़ाइल भेजते समय।
mklement0

2

उप निर्देशिकाओं के बिना, कुछ निर्देशिका की सामग्री की सूची बनाना

मुझे lsनमूने के लिए विकल्पों का उपयोग करना पसंद है :

  • -l एक लंबी सूची प्रारूप का उपयोग करें
  • -t संशोधन समय के अनुसार क्रमबद्ध, सबसे पहले नया
  • -r छँटाई करते समय रिवर्स ऑर्डर
  • -F, --classify परिशिष्ट सूचक (प्रविष्टियों में से एक * / => @ |)
  • -h, --human-readable -l और -s के साथ, प्रिंट आकार जैसे 1K 234M 2G आदि ...

कुछ समय --colorऔर अन्य सभी। (देखें ls --help)

सब कुछ सूचीबद्ध लेकिन फ़ोल्डर्स

इसमें फाइल, सिमिलिंक, डिवाइस, पाइप, सॉकेट आदि दिखाई देंगे।

इसलिए

find /some/path -maxdepth 1 ! -type d

आसानी से दिनांक द्वारा हल किया जा सकता है:

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +

केवल सूचीबद्ध फ़ाइलें :

या

find /some/path -maxdepth 1 -type f

आकार द्वारा क्रमबद्ध:

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

छिपी प्रविष्टियों की सूची रोकें :

छिपी हुई प्रविष्टियों को न दिखाने के लिए, जहाँ नाम डॉट से शुरू होता है, आप जोड़ सकते हैं ! -name '.*':

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +

फिर

आप बदल सकते /some/pathद्वारा .के लिए सूची में वर्तमान निर्देशिका या ..के लिए मूल निर्देशिका


1

तुम भी उपयोग कर सकते हैं lsके साथ grepया egrepऔर उपनाम के रूप में अपने प्रोफ़ाइल में डाल दिया:

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

मैं इसे ऊपर दिए गए कारण के लिए एक स्क्रिप्ट में नहीं डालूंगा, लेकिन एक और त्वरित और गंदा समाधान: ls -F | grep -v '/ $'
mooie

1

फ़ाइलें खोजें: ls -l / home | grep "^ -" | tr -s '' | कट -d '' -f 9

निर्देशिका खोजें: ls -l / home | grep "^ d" | tr -s '' | cut -d '' -f 9

लिंक खोजें: ls -l / home | grep "^ l" | tr -s '' | कट -d '' -f 9

tr -s '' आउटपुट को स्पेस-सीमांकित फ़ाइल में बदल देता है, कट कमांड कहती है कि सीमांकक एक स्पेस है, और 9 वें फ़ील्ड (हमेशा फ़ाइल नाम / निर्देशिका नाम / लिंकनाम) को लौटाएं।

यह मेरे लिए हर समय उपयोगी है!


वाह! क्या होगा अगर फ़ाइलनाम में रिक्त स्थान होते हैं?
एफ। होरी

9 वें क्षेत्र से सब कुछ प्राप्त करने के लिए "9-" का उपयोग करें। लिंक भी इससे प्रभावित होते हैं क्योंकि वे 9 वें क्षेत्र के बाद होंगे।
रिचर्ड

0
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

xargsइसे काम करने के लिए जोड़ा गया, और बिना अतिरिक्त जानकारी के केवल फ़ाइल नाम दिखाने -1के -lलिए इसका उपयोग किया गयाls


इसकी कुछ योग्यता है, इसमें यह समय के find -printf0 '...' | sort -z
हिसाब से

-2

बस कार्लप्लेट के जवाब में जोड़ रहे हैं। फ़ाइलों के बहुत उपयोगी दृश्य के लिए, आप आउटपुट को ls पर पाइप कर सकते हैं।

find . -maxdepth 1 -type f|ls -lt|less

सूची प्रारूप में सबसे हाल ही में संशोधित फ़ाइलें दिखाता है, जब आप बहुत सारी फ़ाइलों को डाउनलोड कर चुके होते हैं, तो बहुत उपयोगी होते हैं, और हाल ही में गैर-क्लट किए गए संस्करण को देखना चाहते हैं।


3
यह शायद वैसा व्यवहार नहीं करता जैसा आप उम्मीद करते हैं! lsमानक इनपुट नहीं पढ़ता है, इसलिए कुछ भी पाइप करना बेकार है ls। क्या आपको याद आया xargs?
१२ बजे gniourf_gniourf

इसे अलग तरीके से रखने के लिए: findइस उत्तर में कमांड को पूरी तरह से अनदेखा किया गया है ; समग्र आदेश समान है ls -lt | less, जो किसी प्रकार की फ़िल्टरिंग नहीं करता है ।
mklement0

1
हालांकि GNU के साथ findआप कर सकते हैं find . -maxdepth 1 -type f -ls। यह भी, मैक ओएस पर काम करने लगता है, हालांकि मेरा मानना है कि -maxdepthऔर -lsठीक से पोर्टेबल विकल्प नहीं हैं।
ट्रिपलआई

-2

"ढूँढें '-maxdepth' मेरे पुराने संस्करण के साथ काम नहीं करता है, इसलिए मैं उपयोग करता हूं:

च में $ के लिए (एलएस); अगर [-f $ f]; तब गूंज $ च; फाई; किया हुआ


का उपयोग for f in $(ls)दोगुना गलत है। आप इसे ठीक कर सकते हैं for f in *लेकिन तब यह टूट जाएगा क्योंकि आप तर्क को echoठीक से उद्धृत नहीं कर रहे हैं ।
ट्रिपलआई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.