मैं एक फ़ोल्डर की सभी फाइलों को कैसे सूचीबद्ध कर सकता हूं लेकिन उनके फ़ोल्डरों या सबफाइल्स को नहीं। दूसरे शब्दों में: मैं केवल फाइलों को कैसे सूचीबद्ध कर सकता हूं?
मैं एक फ़ोल्डर की सभी फाइलों को कैसे सूचीबद्ध कर सकता हूं लेकिन उनके फ़ोल्डरों या सबफाइल्स को नहीं। दूसरे शब्दों में: मैं केवल फाइलों को कैसे सूचीबद्ध कर सकता हूं?
जवाबों:
का उपयोग कर find
:
find . -maxdepth 1 -type f
-maxdepth 1
विकल्प का उपयोग करना सुनिश्चित करता है कि आप केवल वर्तमान निर्देशिका में देखते हैं (या, यदि आप .
किसी पथ के साथ प्रतिस्थापित करते हैं, तो वह निर्देशिका)। यदि आप उस और उपनिर्देशिका में सभी फ़ाइलों की पूर्ण पुनरावर्ती सूची चाहते हैं, तो बस उस विकल्प को हटा दें।
find
मैक पर, न तो विकल्प हैं -type
, न ही -maxdepth
विकल्प।
-type
और -maxdepth
नहीं कर रहे हैं विकल्प सामान्य अर्थों में; बीएसडी find
(जैसा कि ओएस एक्स पर उपयोग किया जाता है) उन्हें प्राइमरी कहता है , और उन्हें फ़ाइल नाम ऑपरेंड (एस) के बाद आना चाहिए ( .
इस मामले में, ध्यान दें कि लिनक्स पर विपरीत, बीएसडी संस्करण को कम से कम एक स्पष्ट फ़ाइल नाम ऑपरेंड की आवश्यकता है); इस उत्तर में कमांड निश्चित रूप से एक मैक पर काम करता है।
find *.png -maxdepth 0 -type f
से बचने के लिए ./
उत्पादन फ़ाइल नामों में उपसर्ग, यह भी ध्यान रखें -maxdepth
की 0
, नहीं 1
) है, जब तक आप सभी की जरूरत फ़ाइल के रूप में नाम में वर्णमाला के क्रम । यदि आप चाहते हैं कि ls
अन्यथा आप के लिए क्या कर सकते हैं (विभिन्न आउटपुट स्वरूप / आदेश, इनलाइन नियंत्रण इस बात पर कि क्या छिपी हुई वस्तुओं को शामिल किया गया है या नहीं), [मल्टी-] टाइप फ़िल्टरिंग के साथ पूरक, मेरे उत्तर से स्क्रिप्ट मदद कर सकता है।
find * -maxdepth 0 -type f
से @ एलेक्सहॉल की टिप्पणी से लिया गया एक विकल्प find . -maxdepth 1 -type f
: आमतौर पर find . ...
इसमें छिपी हुई वस्तुएं शामिल होती हैं , आमतौर पर आउटपुट फ़ाइल नाम के साथ उपसर्ग ./
और, जीएनयू find
(लिनक्स) के साथ, आमतौर पर एक अनसुलझी सूची को आउटपुट करता है। find * ...
, शेल को सामने की ओर ग्लोबिंग करने देने के कारण , डिफ़ॉल्ट रूप से छिपे हुए आइटम को छोड़कर (के साथ बदला जा सकता है shopt -s dotglob
), आउटपुट मात्र फ़ाइलनाम (कोई उपसर्ग नहीं), वर्णानुक्रम में सॉर्ट किया गया। न तो दृष्टिकोण में फ़ाइलों के लिए सीमलिंक शामिल हैं ; -L
ऐसा करने के लिए विकल्प का उपयोग करें।
ls -p | grep -v /
ls -p आपको फ़ोल्डर के नाम के बाद / दिखाता है, जो आपको हटाने के लिए टैग के रूप में कार्य करता है।
ls
के अलावा find
, बाद रिटर्न संबंधित पथ और पूर्व केवल फ़ाइल नाम के बाद से। इस काम के लिए सही उपकरण का उपयोग करें।
कारप्लेट- 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
निर्देशिकाओं के लिए, औरl
ls
तर्क की सूची से पहले सहानुभूति रखने के लिए (रन 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)
समर्थित मंच
नोट: यदि आप 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
(नंबर एक); ls
वास्तव में "नंगे" आउटपुट को डिफॉल्ट करता है, अर्थात, केवल फ़ाइल नाम, लेकिन जब टर्मिनल पर आउटपुट एक कॉलम-आधारित लेआउट (प्रति पंक्ति कई फ़ाइल नाम) का उपयोग करता है। प्रति आउटपुट लाइन में एक फ़ाइल नाम प्राप्त करने के लिए (जो कि क्या dir /b
करता है, यदि मेमोरी कार्य करता है), -1
विकल्प का उपयोग करें , जो वास्तव में अंतर्निहित है जब stdout एक टर्मिनल से जुड़ा नहीं है , जैसे कि पाइप या आउटपुट फ़ाइल भेजते समय।
मुझे 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
द्वारा .
के लिए सूची में वर्तमान निर्देशिका या ..
के लिए मूल निर्देशिका ।
फ़ाइलें खोजें: 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 वें फ़ील्ड (हमेशा फ़ाइल नाम / निर्देशिका नाम / लिंकनाम) को लौटाएं।
यह मेरे लिए हर समय उपयोगी है!
बस कार्लप्लेट के जवाब में जोड़ रहे हैं। फ़ाइलों के बहुत उपयोगी दृश्य के लिए, आप आउटपुट को ls पर पाइप कर सकते हैं।
find . -maxdepth 1 -type f|ls -lt|less
सूची प्रारूप में सबसे हाल ही में संशोधित फ़ाइलें दिखाता है, जब आप बहुत सारी फ़ाइलों को डाउनलोड कर चुके होते हैं, तो बहुत उपयोगी होते हैं, और हाल ही में गैर-क्लट किए गए संस्करण को देखना चाहते हैं।
ls
मानक इनपुट नहीं पढ़ता है, इसलिए कुछ भी पाइप करना बेकार है ls
। क्या आपको याद आया xargs
?
find
इस उत्तर में कमांड को पूरी तरह से अनदेखा किया गया है ; समग्र आदेश समान है ls -lt | less
, जो किसी प्रकार की फ़िल्टरिंग नहीं करता है ।
find
आप कर सकते हैं find . -maxdepth 1 -type f -ls
। यह भी, मैक ओएस पर काम करने लगता है, हालांकि मेरा मानना है कि -maxdepth
और -ls
ठीक से पोर्टेबल विकल्प नहीं हैं।
"ढूँढें '-maxdepth' मेरे पुराने संस्करण के साथ काम नहीं करता है, इसलिए मैं उपयोग करता हूं:
च में $ के लिए (एलएस); अगर [-f $ f]; तब गूंज $ च; फाई; किया हुआ
for f in $(ls)
दोगुना गलत है। आप इसे ठीक कर सकते हैं for f in *
लेकिन तब यह टूट जाएगा क्योंकि आप तर्क को echo
ठीक से उद्धृत नहीं कर रहे हैं ।