मैं कमांड लाइन का उपयोग करके डायरेक्टरी में फाइलों की गिनती कैसे प्राप्त कर सकता हूं?


193

मेरे पास बड़ी संख्या में फाइलों के साथ एक निर्देशिका है। मुझे lsगिनती प्रदान करने के लिए एक स्विच नहीं दिख रहा है । क्या फाइलों की गिनती पाने के लिए कुछ कमांड लाइन मैजिक है?



tree . | tailया tree -a . | tailछुपी हुई फ़ाइलें / dirs शामिल करने के लिए, treeपुनरावर्ती यदि आप चाहते हैं कि है।
CodyChan

जवाबों:


239

"फ़ाइल" की एक व्यापक परिभाषा का उपयोग करना

ls | wc -l

(ध्यान दें कि यह छिपी हुई फाइलों की गिनती नहीं करता है और मान लेता है कि फाइल के नाम में न्यूलाइन वर्ण नहीं हैं)।

छिपी हुई फ़ाइलें शामिल करने के लिए (सिवाय .और ..और) न्यू लाइन पात्रों के साथ समस्याओं से बचने, विहित तरीका है:

find . ! -name . -prune -print | grep -c /

या पुनरावर्ती:

find .//. ! -name . -print | grep -c //

23
wcएक "शब्द गणना" कार्यक्रम है। -lस्विच लाइनों गिनती करने के लिए यह कारण बनता है। इस मामले में, यह आउटपुट में लाइनों को गिन रहा है ls। यह हमेशा वह तरीका है जो मुझे किसी दिए गए निर्देशिका के लिए फ़ाइल गणना प्राप्त करने के लिए सिखाया गया था।
सैंडी

20
कृपया ध्यान दें कि यदि आउटपुट एक पाइप lsहै ls -1तो यह नोट करें ।
lesmana

6
यह सब कुछ एक निर्देशिका में नहीं मिलता है - आपने डॉट फाइलें याद की हैं, और कुछ अतिरिक्त लाइनें भी एकत्र की हैं। एक खाली निर्देशिका अभी भी 1 पंक्ति लौटेगी। और यदि आप कॉल करते हैं ls -la, तो आपको निर्देशिका में तीन लाइनें मिलेंगी। आप और प्रविष्टियों ls -lA | wc -lको छोड़ना चाहते हैं। आप अभी भी एक-के-बाद-एक होंगे। ...

1
एक खाली निर्देशिका मेरे लिए 0 लौटाती है
जेम्स रोथ

2
एक सही दृष्टिकोण, जो नाम में newlines के साथ डबल गिनती फ़ाइलों को नहीं करेगा, यह होगा: ls -q | wc -l- हालांकि ध्यान दें कि छिपी हुई फाइलें अभी भी इस दृष्टिकोण से नहीं गिना जाएंगी, और उस निर्देशिका को गिना जाएगा।
गॉडलीजेक

30

फ़ाइल की संकीर्ण परिभाषा के लिए:

 find . -maxdepth 1 -type f | wc -l

और आप निश्चित रूप से -maxdepth 1फ़ाइलों को पुनरावर्ती रूप से गिनने के लिए छोड़ सकते हैं (या इच्छित अधिकतम खोज गहराई के लिए इसे समायोजित कर सकते हैं)।
user7089

1
यदि आपके पास एक फ़ाइल है जिसके नाम में एक नई रेखा है, तो यह दृष्टिकोण गलत तरीके से इसे दो बार गिना जाएगा।
Godlygeek

7
एक सही दृष्टिकोण, जो नाम में newlines के साथ फाइलों की दोहरी गिनती नहीं करेगा, यह होगा:find -maxdepth 1 -type f -printf "\n" | wc -l
Godlygeek

+1 छिपी हुई फ़ाइलों के लिए अनुमति दें और निर्देशिकाओं को अनदेखा करें
माइकल ड्यूरेंट

13
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: नोट ls - <नंबर-एक> | wc - <अक्षर- l>


10
अधिकांश संस्करण स्वचालित रूप से lsकरते -1हैं जब आउटपुट एक पाइप पर होता है।
डेनिस विलियमसन

3
@ डेनिस दिलचस्प है कि मुझे पता नहीं था कि एक एप्लिकेशन बता सकता है कि इसका आउटपुट एक पाइप पर जा रहा है।
xenoterracide

1
I + 'इस संस्करण को एड करता है क्योंकि यह अधिक स्पष्ट है। हालाँकि, हाँ ls -1 का उपयोग करता है यदि यह पाइप किया गया है (इसे आज़माएं: ls | cat), मुझे -1 सिंटैक्स अधिक स्पष्ट लगता है।
गाबे

3
@xenoterracide: बैश में:[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
डेनिस विलियमसन

2
मेरे परीक्षणों में फ़ाइल नाम को छाँटने से बचने के लिए -f विकल्प प्रदान करना भी काफी तेज़ था। दुर्भाग्य से आपको अभी भी गलत जवाब मिलता है अगर आपके फ़ाइल नाम में नई सुर्खियाँ हैं।
शमूएल एडविन वार्ड

10

संभवतः ls/ wcजोड़ी का उपयोग करते हुए सबसे पूर्ण उत्तर है

ls -Aq | wc -l

यदि आप डॉट फाइलें गिनना चाहते हैं, और

ls -q | wc -l

अन्यथा।

  • -Aडॉट फाइलें गिनना है, लेकिन छोड़ना .और ..
  • -qप्रत्येक फ़ाइल के लिए आउटपुट 1 लाइन बनाने के lsसाथ, विशेष रूप से न्यूलाइन वर्णों को प्रतिस्थापित करें?

lsटर्मिनल से एक-लाइन आउटपुट प्राप्त करने के लिए (अर्थात इसमें पाइपिंग के बिना wc), -1विकल्प जोड़ना होगा।

( lsकोरुटिल्स 8.23 ​​के साथ परीक्षण का व्यवहार )


2
जैसा कि आपने कहा, -1जरूरत नहीं है। जैसा कि "यह कंसोल आउटपुट के साथ फ़ाइल नाम में समझदारी से संभालता है" , यह -qस्विच के कारण है ( क्योंकि आपको -bपोर्टेबल होने के बजाय इसका उपयोग करना चाहिए ) जो "गैर-मुद्रण योग्य फ़ाइल नाम वर्ण और <टैब> वर्ण के प्रत्येक उदाहरण को लिखने के लिए मजबूर करता है के रूप में <प्रश्न-चिह्न> ('?') वर्ण। कार्यान्वयन डिफ़ॉल्ट रूप से यह विकल्प प्रदान कर सकता है यदि आउटपुट एक टर्मिनल डिवाइस पर है। " इसलिए ls -Aq | wc -lसभी फाइलों / ls -qp | grep -c /
डायरियों

आपके सहयोग के लिए धन्यवाद। को बदल -bदिया -q
फ्राक

7

यदि आप जानते हैं कि वर्तमान निर्देशिका में कम से कम एक गैर-छिपी हुई फ़ाइल है:

set -- *; echo "$#"

यह स्पष्ट रूप से किसी भी ग्लोब के लिए सामान्य है।

एक स्क्रिप्ट में, यह स्थितिगत मापदंडों को अधिलेखित करने का कभी-कभी दुर्भाग्यपूर्ण दुष्प्रभाव होता है। आप एक उप-प्रकार का उपयोग करके या एक फ़ंक्शन (बॉर्न / POSIX संस्करण) जैसे के साथ काम कर सकते हैं जैसे:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

एक वैकल्पिक समाधान है $(ls -d -- * | wc -l)। यदि ग्लोब है *, तो कमांड को छोटा किया जा सकता है $(ls | wc -l)lsहमेशा के आउटपुट को पार्स करने से मुझे बेचैनी होती है, लेकिन यहां तब तक काम करना चाहिए जब तक कि आपके फ़ाइल नामों में नईलाइन्स न हों, या आपका lsबच जाए। और $(ls -d -- * 2>/dev/null | wc -l)एक मैचिंग ग्लोब के केस को इनायत से हैंडल करने का फायदा है (यानी, यह उस स्थिति में 0 रिटर्न करता है, जबकि इस set *तरीके के लिए फिडली टेस्ट की जरूरत होती है , अगर ग्लोब खाली हो सकता है)।

यदि फ़ाइल नामों में न्यूलाइन वर्ण हो सकते हैं, तो विकल्प का उपयोग करना है $(ls -d ./* | grep -c /)

उन समाधानों में से कोई भी, जो एक ग्लोब के विस्तार को पारित करने पर भरोसा करते lsहैं, एक तर्क सूची के साथ बहुत लंबी त्रुटि हो सकती है यदि बहुत अधिक मिलान वाली फाइलें हैं।


1
क्या आप वास्तव में 13,923 स्थितीय मापदंड बनाना चाहते हैं? और आपको अपना स्थानीय वैरिएबल बनाना चाहिए localया इसे खत्म करना चाहिए : eval $1=$#या बस उपयोग echo $#और करना चाहिए number_of_files=$(count_words *)
डेनिस विलियमसन

1
@ डेनिस: बिंदु का हिस्सा फोर्किंग से बचने के लिए था। मुझे लगता है कि यह 21 वीं सदी की चिंता नहीं है। ठीक है, मैं मानता हूं कि मुझे गैर-पोसिक्स गोले की कोई परवाह नहीं है, इसलिए मैं अस्थायी चर से बच सकता था।
गिल्स

आपने एक को क्यों घटाया $#(आपने संपादन से पहले ऐसा नहीं किया)?
डेनिस विलियमसन

@ डेनिस: मैं अभी भी एक कांटा से बच रहा हूं (ठीक है, यह धीमी सीपीयू जैसे राउटर के साथ मशीनों पर एक फर्क पड़ता है) और एक चर नाम के रूप में गुजर रहा है $1। तो जो मैं गिनना चाहता हूं वह उन मापदंडों की संख्या है जो पहले पैरामीटर नहीं हैं। (मैं उपयोग नहीं कर सकता shiftक्योंकि मुझे चर नाम रखने की आवश्यकता है।) (उम्म, अब अगर आपने पहली पंक्ति के बारे में पूछा है ...)
Gilles

@ डेनिस: यह सोचने के लिए आते हैं, shiftअगर मैं इसे सही समय पर उपयोग कर सकता हूं।
गाइल्स

7

मुझे du --inodesउपयोगी मिल गया है, लेकिन मुझे यकीन नहीं है कि इसके किस संस्करण की duआवश्यकता है। इसका उपयोग करते हुए वैकल्पिक दृष्टिकोणों की तुलना में काफी तेज होना चाहिए findऔर wc

Ubuntu 17.10 पर, निम्नलिखित कार्य करता है:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

| sort -nrइनोड की संख्या से अवरोही क्रमबद्ध करने के लिए संयोजित करें ।


5

यदि हम जोड़ रहे हैं तो ls / wc युग्म का उपयोग करते समय यह बहुत तेज़ होगा (सॉर्ट न करें)।

ls -AqU | wc -l

1
-Uहालांकि जीएनयू-विशिष्ट है।
स्टीफन चेज़लस

4

ट्री कमांड स्थापित करने के बाद, बस टाइप करें:

tree

यदि आप छिपी हुई फ़ाइलें भी चाहते हैं:

tree -a

यदि आप डेबियन / मिंट / उबंटू लिनक्स का उपयोग कर रहे हैं, तो ट्री कमांड को स्थापित करने के लिए निम्न कमांड टाइप करें:

sudo apt-get install tree

विकल्प -L का उपयोग डायरेक्टरी ट्री के अधिकतम प्रदर्शन स्तर को निर्दिष्ट करने के लिए किया जाता है। ट्री कमांड न केवल फाइलों की संख्या, बल्कि निर्देशिका की संख्या को भी गिनता है, जैसा कि आप चाहते हैं, डायरेक्टरी ट्री के कई स्तरों पर विचार करें।


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

2
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1इसे गैर-पुनरावर्ती बना देगा, findडिफ़ॉल्ट रूप से पुनरावर्ती है
  • -type f केवल फ़ाइलें शामिल होंगी
  • -printf .एक प्यारा स्पर्श है। यह फ़ाइल नाम के बजाय प्रत्येक फ़ाइल के लिए एक डॉट प्रिंट करता है, और अब यह किसी भी फ़ाइल नाम को संभालने में सक्षम है और डेटा को भी बचाता है; हमें बस डॉट्स गिनना है :)
  • | wc -c वर्ण गिनता है

1

कोई पाइप नहीं, कोई स्ट्रिंग कॉपी नहीं, कोई कांटा नहीं, बस सादा बैश वन लाइनर

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount

1
यदि निर्देशिका में कोई फ़ाइल नहीं है तो 1 का मान देता है। फाइलों की गिनती नहीं करता, फाइलों और निर्देशिकाओं की गिनती करता है।
स्टीव

1

यहां एक अन्य तकनीक है जो पोस्ट की गई गिल्स की तर्ज पर है :

word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)

जो 13,923 तत्वों के साथ एक सरणी बनाता है (यदि यह है कि वहाँ कितनी फाइलें हैं)।


उस cसरणी की क्या बात है ? word_count() { echo "$#"; }पर्याप्त होगा। @ गिल्स सॉल्यूशन का बिंदु एक बदले हुए चर में गिनती को स्टोर करने के लिए है ताकि कमांड प्रतिस्थापन (जिसमें ksh93 के अलावा गोले में एक कांटा और पाइप शामिल है) का उपयोग करने से बचें।
स्टीफन चेज़लस

1
find . -type f -maxdepth 1 |  wc -l 

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


find . -type fवर्तमान निर्देशिका में और उप-निर्देशिकाओं में भी पुनरावर्ती रूप से फाइलें मिलेंगी।
ढग

0

यह कोशिश करो मुझे आशा है कि यह उत्तर आपकी मदद करेगा

echo $((`ls -l | wc -l` -1 ))


0

पहले दिए गए कुछ उत्तरों को सुधारना लेकिन इस बार स्पष्ट रूप से करना।

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

यह कुछ प्रिय आज्ञाओं के उपयोग tailऔर जैसे नोटिस करने के लिए योग्य है cut। यह भी ध्यान दें कि पेड़ डिफ़ॉल्ट रूप से उपलब्ध नहीं है। ऊपर के कमांड पहले स्तर 1 पर निर्देशिका के बारे में जानकारी कैप्चर करते हैं, फिर अंतिम पंक्ति प्राप्त करते हैं tail -n 1जहां हमारा लक्ष्य है, और cutतीसरे शब्द को लेने के लिए समाप्त होता है ।

उदाहरण के लिए, इसमें पता लगाना /:

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

फिर, निर्देशिकाओं की संख्या पूछने के बारे में क्या?


0

लिनक्स पर, कमांड को बहुत मजबूत बनाने और उन फाइलों को संभालने के लिए, जिनके नाम में नईलाइन हो सकती हैं, इसका उपयोग करें:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

यह हमें पार्सिंग आउटपुट के क्रम से बचाता है ls


सम्बंधित:


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.