निर्देशिकाओं के बिना फ़ाइलों को कैसे सूचीबद्ध करें, और नाम से फ़िल्टर करें (ls विकल्प)


42

मेरे पास एक निर्देशिका है uploads। इसमें फ़ाइलों का एक समूह होता है, साथ ही कुछ उपनिर्देशिकाएँ भी होती हैं, जिनमें फाइलें होती हैं।

क्या कोई तरीका है जो मैं (एक कदम में) निम्नलिखित कर सकता हूं:

  1. रूट अपलोड निर्देशिका में केवल फ़ाइलों की सूची - मैं सबफ़ोल्डर नाम या उनकी सामग्री नहीं देखना चाहता;

    तथा

  2. किसी भी फाइल को सूचीबद्ध न करें जो इसके साथ शुरू होती है t_

मैं -dध्वज के बारे में जानता हूं , लेकिन यह मुझे वह नहीं मिलता है जो मैं चाहता हूं।

जवाबों:


53

यह एक नौकरी के लिए लगता है find

  • -maxdepthकेवल वर्तमान निर्देशिका वापस करने के लिए उपयोग करें , सबफ़ोल्डर के अंदर पुन: खोज न करें
  • -type fकेवल फाइलों को वापस करने के लिए उपयोग करें और निर्देशिका या डिवाइस नोड या जो कुछ भी नहीं है
  • यदि आप चाहते हैं कि नामों के साथ फ़ाइलों से बचने के लिए -notऔर संयोजन का उपयोग करें-name

यह इस तरह एक साथ आ सकता है:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'

धन्यवाद! मैं सीएलआई के लिए बहुत नया हूं और पहले कभी नहीं पाया था। मैं निश्चित रूप से इसमें आगे देखूंगा।
एमीज जूल

2
@EmmyS: आप एक और छोटी चाल यहाँ उपयोगी पा सकते हैं। @Gilles ने -exec ls -lG -- {} +अपने उत्तर में ls के अतिरिक्त विकल्पों का उपयोग करके आउटपुट प्राप्त करने के लिए उपयोग करने का उल्लेख किया है । आप इसे भी देख सकते हैं -lsls के विस्तृत दृश्य का एक त्वरित और गंदा अनुमान प्राप्त करने के लिए।
कालेब

18

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

ls --hide='t_*' uploads

एक और तरीका यह है कि अपने शेल को मिलान करना चाहिए। बैश, ksh और zsh में !(t_*)मिलान करने के अलावा सभी फाइलों को मिलाने के लिए एक नकारात्मक पैटर्न है t*; shopt -s extglobकोस में इस सुविधा को चालू करने की आवश्यकता है , और zsh में इसे चालू करने की आवश्यकता है setopt ksh_glob। Zsh के समतुल्य वाक्य रचना भी है ^t_*जिसे चालू करने की आवश्यकता है setopt extended_glob। यह अभी भी निर्देशिकाओं को अनदेखा नहीं करता है। Zsh में एक अतिरिक्त विशेषता है जो न केवल नाम से, बल्कि मेटाडेटा और अधिक: ग्लोब क्वालिफायर से भी फाइलों को मिलान करने की अनुमति देता है । (.)नियमित फ़ाइलों को प्रतिबंधित करने के लिए एक मैच के अंत में जोड़ें । नकार ^नाम मिलान वाक्यविन्यास का हिस्सा है, तो ^t_*(.)इसका अर्थ है "सभी नियमित फ़ाइलें मेल नहीं खा रही हैं t_*" और "सभी फाइलें जो नियमित रूप से फाइल मिलान नहीं कर रही हैं t_*"।

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

यदि आप अपने आप को उन्नत उपकरणों के बिना पाते हैं, तो आप इसके साथ किसी भी यूनिक्स पर कर सकते हैं find। यह आमतौर पर कमांड लाइन पर आपके द्वारा टाइप की जाने वाली चीज नहीं है, लेकिन यह शक्तिशाली और सटीक है। कालेब पहले ही दिखा चुका है कि GNU खोजने के साथ यह कैसे करना है-maxdepthविकल्प पोर्टेबल नहीं है, आप -pruneइसके बजाय उपयोग कर सकते हैं , को पुनरावृत्ति करने findसे रोकने के लिए ।

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

बदलें -printद्वारा -exec ls -lG -- {} +निष्पादित करने के लिए lsफाइलों पर अपने पसंदीदा विकल्पों के साथ।

ऊपर के सभी कमांड्स डॉट फाइलें (यानी जिनके नाम से शुरू होती है .) को छिपाते हैं । यदि आप उन्हें प्रदर्शित करना चाहते हैं, तो पास -Aकरें lsया Dzsh ( ls uploads/^t_*(.D)) में ग्लोब क्वालिफायर जोड़ें । इसके साथ find, आप इसे केवल एक स्तर पर फिर से बनाने के एक अलग दृष्टिकोण का उपयोग कर सकते हैं ( findविशेष रूप से डॉट फ़ाइलों का इलाज नहीं करता है)। यदि आप findवर्तमान निर्देशिका में चलते हैं तो यह पूरी तरह से काम करता है ।

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

3
क्या आपके पास एक दिन है? ;-) मैं लगातार आपके जवाबों की लंबाई और स्तर के बारे में चकित हूँ, यहां तक ​​कि सबसे सरल दिखने वाले सवालों के बारे में यहां यूनिक्स एसई! .. वैसे भी जारी रखें! :)
एलेक्स

धन्यवाद! बहुत अच्छी जानकारी। मुझे नहीं पता कि मेरे पास "उन्नत उपकरण" हैं या अभी नहीं; मैं मैक पर काम कर रहा हूं (हालांकि घर पर लिनक्स, इसलिए मुझे यकीन है कि यह कुछ बिंदु पर काम में आएगा।)
एमीज़ जूल

@EmmyS: आपके लिनक्स बॉक्स के लिए मेरे -maxdepthकाम का उपयोग होना चाहिए, लेकिन "पोर्टेबिलिटी" की समस्या गिल्स को संदर्भित करती है कि बीएसडी find(ओएसएक्स मुझे भी लगता है) थोड़ा अलग जानवर है, इसलिए आपको उसके जवाब की भी आवश्यकता हो सकती है। @ गिल्स: zsh ट्रिक के लिए +1!
कालेब

1
@ गिल्स: कुछ मनमोहक टिप्पणियां नहीं pruneआईं, लेकिन मेरे मन में यह कहकर बस जाने दिया कि जब मैं अपने सिस्टम पर चारों ओर से टकरा रहा हूं तो सोचा था कि " अगर यह चालू होता तो यह कमांड काम करता " AIX, Solaris या MINIX3 "लगभग ... स्टैंडबाय ... मुझे मीटर रीडिंग में मुश्किल समय हो रहा है ... डिस्प्ले के साथ जमे हुए हैं 0.00
कालेब

2
क्या ग्नू के lsपास कोई --use-telepathyविकल्प नहीं है? यह आपके द्वारा इच्छित फ़ाइलों को प्रदर्शित करने का सबसे तेज़ तरीका है। यह पोर्टेबल नहीं हो सकता है।
डबियसजिम

8
ls -l /folder | grep ^- | awk '{print $9}'

$9इस कथन में क्या है ?
एम्मी

3
@EmmyS इसका मतलब आउटपुट का 9 वां फील्ड / कॉलम है। यह उत्तर आउटपुट को पार्सls करने की कोशिश कर रहा है ।
jw013

print $ NF` अधिक बेहतर, IMO होगा। $ NF का अर्थ है फ़ील्ड्स की संख्या, जो 9 होगी और AWK में एक आम उपयोग है जो $ NF के बारे में दूसरों को सिखाने का अच्छा अवसर है।
एलिजा लिन

1
ls -l | grep -v ^d | grep name$

इस समाधान को (जिसमें कई कमांड और पाइप की आवश्यकता होती है) बेहतर होगा find?
हेलोसिहॉस्ट

यह संक्षिप्त है, पढ़ने के लिए आसान है और ls कमांड सम्मेलन के साथ रहता है। मुझे यह याद रखना आसान लगता है कि कमांड के तर्क क्या हैं। विकल्पों में से प्रत्येक के लिए अपने और यश!
tkjef

0

मुझे इसे एक शॉट का उपयोग करके lsऔर पाइप दें:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

अंतिम कॉलम 9 वां है।


1
यदि रिक्त स्थान वाली फाइलें हैं तो क्या होगा?
जोर्डनम

0

अगर एक -maxdepth पोर्टेबिलिटी का मुद्दा एक चिंता का विषय है, तो आप उपयोग कर सकते हैं:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

मैं विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि यह काम करना चाहिए। मुझे लगता है कि यह थोड़ा गूढ़ लग रहा है, लेकिन अगर आप अजीब बोलते हैं, तो यह वास्तव में नहीं है। $ 9 के बजाय $ NF का उपयोग किया जा सकता है। आप भी कर सकते हैं:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

जो एक ही बात करता है (लेकिन शायद पूर्व की तुलना में कम कुशलता से)।

दरअसल, अन्य पोस्ट के बारे में सोचने के बाद, ऐसा लगता है

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

और भी छोटा और स्पष्ट तरीका है।

अगर मैं गलत हूं तो कोई मुझे सही करे। :-)


पार्सिंग lsआमतौर पर एक अच्छा विचार नहीं है । उदाहरण के लिए, आपके व्हाट्सएप व्हाट्सएप के साथ फ़ाइलनाम के साथ विफल हो जाएंगे।
Mat

@mat - सुधार के लिए धन्यवाद। आपके (और jw013) लेख को पढ़ने के बाद, मैंने देखा कि ls को सही फ़ाइल नामों के आउटपुट पर भरोसा नहीं किया जा सकता है। यहां तक ​​कि अगर मैं $ 9 से लाइन के अंत तक (व्हाट्सएप को शामिल करने के लिए) सब कुछ प्रिंट करने के लिए awk कोड को फिर से लिखना चाहता था, तो यह ls आउटपुट अभी भी गलत हो सकता है। यह निराशाजनक है और इसे आईएमओ को सुधारा जाना चाहिए। एक बार फिर धन्यवाद।
kasaszub


-1

इस उपनाम को आज़माएं और इसका उपयोग करें:

alias l='ls -hLlF'

ls -hLlFउपनिर्देशिका दिखाती है और यह फाइलों को दिखाती है t_। तो इस सवाल का जवाब कैसे देता है?
राफेल अहरेंस

शायद मैंने सवाल गलत समझा। ls -hLlF लिंक्ड डायरेक्टरीज़ के टारगेट डाइरेक्टरीज़ को नहीं दिखाएगा।
दानेदार

ऐसा लगता है। लेकिन क्या आपने प्रश्न के अन्य उत्तर नहीं पढ़े हैं?
राफेल एहरेंस

-1

बहुत आसान:

ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d


(१) यह उत्तर इतना आसान है, यह पहले दिया जा चुका है। (२) आप यह क्यों मानते हैं कि आपको निर्देशिका का पूरा रास्ता बताने की आवश्यकता है?
स्कॉट

@ सच - यह समाधान प्राप्त करने का एक बहुत ही त्वरित और सरल तरीका है। उत्तर को सार्वभौमिक बनाने के लिए पूर्ण पथ निर्दिष्ट किया गया था ...
डिगगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.