2012-02-06 14 views
380

में फ़ाइलों को दोबारा गिनती करना मैं लिनक्स निर्देशिका में फ़ाइलों को दोबारा कैसे गिन सकता हूं?लिनक्स निर्देशिका

find DIR_NAME -type f ¦ wc -l 

लेकिन यह निम्नलिखित त्रुटि देता है जब मैं इस चलाएँ:

मैं इस पाया।

खोज: पथ अभिव्यक्ति पूर्व में होना चाहिए: |

+42

आप टूटा बार '|' (ASCII 166) को लंबवत बार' | '(ASCII 124) के साथ [यूनिक्स पाइपलाइन] के लिए उपयोग कर रहे हैं (http://en.wikipedia.org/wiki/Pipeline_ % 28Unix% 29)। –

+2

@SkippyleGrandGourou इसे पाइप नहीं कहा जाता है? – DaveStephens

+18

@ डेवस्टेन्स हां, इसे भी कहा जाता है। इसे शेफर स्ट्रोक, वर्टी-बार, वीबार, स्टिक, वर्टिकल लाइन, वर्टिकल स्लैश, बार, ओबिलिस्क, ग्लिडस भी कहा जाता है। – emlai

उत्तर

757

यह काम करना चाहिए:

find DIR_NAME -type f | wc -l 

स्पष्टीकरण:

  • -type f उन फ़ाइलों को शामिल करने के लिए।
  • | (और नहीं ¦) find आदेश के wc आदेश के मानक इनपुट के लिए मानक आउटपुट पुनर्निर्देश।
  • wc (शब्द गणना के लिए संक्षिप्त) इसके इनपुट पर न्यूलाइन, शब्द और बाइट्स की गणना करता है (docs)।
  • -l सिर्फ न्यूलाइनों को गिनने के लिए।

नोट्स:

  • . साथ DIR_NAME बदलें वर्तमान फ़ोल्डर में आदेश पर अमल करने के लिए।
  • आप गिनती में निर्देशिका (और सिम्लिंक) को शामिल करने के लिए -type f को भी हटा सकते हैं।
  • यह संभव है कि फ़ाइल नाम में न्यूलाइन वर्ण हो सकते हैं तो यह आदेश अधिक होगा। क्यों अपने उदाहरण काम नहीं करता है की

स्पष्टीकरण:

आदेश आप दिखाते हैं तो आप "पाइप" का उपयोग नहीं करते (|) तरह-के दो आदेशों कनेक्ट करने के लिए है, लेकिन टूटी बार (¦) जिसे खोल कमांड या कुछ समान के रूप में नहीं पहचानता है। यही कारण है कि आपको वह त्रुटि संदेश मिलता है।

+16

'टाइप' में 'f' फाइलों के लिए खड़ा है और शब्द गणना लाइनों के लिए 'wc -l' है। –

+1

गिनती – phatblat

+1

में निर्देशिका शामिल करने के लिए '-type f' को निकालें क्या कोई तेज विधि है? क्योंकि अगर आप इसे/ – poitroae

46

वर्तमान निर्देशिका के लिए:

find . -type f | wc -l 
3

निर्धारित करने के लिए कितने फ़ाइलों ls -1 | wc -l में डाल मौजूदा निर्देशिका में देखते हैं,। ls -1 के आउटपुट में (-l) लाइनों की संख्या की गणना करने के लिए यह wc का उपयोग करता है। यह dotfiles गिनती नहीं है। कृपया ध्यान दें कि ls -l (यह पिछले उदाहरणों में "1" की बजाय "एल" है) जो मैंने इस हाउटो के पिछले संस्करणों में उपयोग किया है, वास्तव में आपको वास्तविक गणना से अधिक एक फ़ाइल गिनती देगा। इस बिंदु के लिए काम नेजाद के लिए धन्यवाद।

यदि आप केवल फाइलों को गिनना चाहते हैं और इसमें प्रतीकात्मक लिंक शामिल नहीं हैं (केवल एक उदाहरण जो आप कर सकते हैं), तो आप ls -l | grep -v ^l | wc -l का उपयोग कर सकते हैं (यह एक "एल" इस समय "1" नहीं है, हम एक " लंबे "यहां लिस्टिंग)। grep "एल" (एक लिंक इंगित करने) से शुरू होने वाली किसी भी लाइन के लिए चेक करता है, और उस रेखा को छोड़ देता है (-v)।

सापेक्ष गति: "ls -1/usr/bin/| wc -l" एक अनलोड किए गए 486SX25 (/ usr/bin/इस मशीन पर 355 फाइलें) पर लगभग 1.03 सेकंड लेता है। "ls -l /usr/bin/ | grep -v ^l | wc -l" में लगभग 1.1 9 सेकंड लगते हैं।

स्रोत: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html

+2

'ls -l' को अपने आकार, माटा और अन्य गुणों को पढ़ने के लिए प्रत्येक फ़ाइल पर' stat' syscall करना चाहिए, जो धीमा है। 'Ls -l' चलने वाली बड़ी निर्देशिकाओं (100,000+ फ़ाइलों) पर कई मिनट लग सकते हैं। तो केवल फाइलों की गणना करने के लिए, हमेशा 'ls -1 | का उपयोग करें wc -l'। – Marki555

+0

ए 486 एसएक्स 25, अच्छा – cam8001

36

आप कैसे कई फाइलों अपने वर्तमान dir के तहत प्रत्येक निर्देशिका में हैं के टूटने चाहते हैं:

for i in $(find . -maxdepth 1 -type d) ; do 
    echo -n $i": " ; 
    (find $i -type f | wc -l) ; 
done 

कि निश्चित रूप से एक लाइन पर सभी जा सकते हैं,। कोष्ठक स्पष्ट करता है कि किस आउटपुट wc -l को इस मामले में देखने के लिए देखा जाना चाहिए (find $i -type f)।

+2

ऐड-माइंडपथ 1 छोड़ने के लिए। – kdubs

+3

यह उनके नामों में रिक्त स्थान वाली निर्देशिकाओं पर फंस सकता है। 'ढूंढने के लिए पहली पंक्ति बदलना। -मैक्सडेपथ 1-प्रकार डी -प्रिंट 0 | जबकि आईएफएस = read -r -d '' i; करो 'इसे ठीक करता है। देखें [मैं एक फ़ाइल (डेटा स्ट्रीम, वेरिएबल) लाइन-बाय-लाइन (और/या फ़ील्ड-बाय-फील्ड) कैसे पढ़ सकता हूं?] (Http://mywiki.wooledge.org/BashFAQ/001) –

28

आप

$ sudo apt-get install tree 

साथ पेड़ पैकेज स्थापित करने के बाद (एक Debian/टकसाल/Ubuntu Linux मशीन पर)

$ tree 

उपयोग कर सकते हैं।

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

छिपी हुई फ़ाइलों को -a विकल्प की आपूर्ति करके भी शामिल किया जा सकता है।

+2

यह वास्तव में है निर्देशिकाओं और फ़ाइलों की संख्या देखने का सबसे आसान तरीका। –

+7

मैन पेज से: _By डिफ़ॉल्ट पेड़ छुपा फाइलों को प्रिंट नहीं करता है। आपको उन्हें शामिल करने के लिए '-a' विकल्प प्रदान करना होगा। – eee

6

आप को पता है कि कितने फ़ाइलों और उप-निर्देशिका वर्तमान कार्यशील निर्देशिका से मौजूद आपको यह एक-लाइनर

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n 

यह जीएनयू स्वाद में काम करेंगे उपयोग कर सकते हैं, और बस से -e छोड़ चाहते हैं बीएसडी लिनक्स (जैसे ओएसएक्स) के लिए इको कमांड।

+2

उत्कृष्ट समाधान! मुझे मिला एकमात्र मुद्दा रिक्त स्थान या विशेष वर्णों वाली निर्देशिका थी। उद्धरण जोड़ें जहां डीआईआर नाम का उपयोग किया जाता है: 'ढूंढें। -मैक्सडेपथ 1-प्रकार डी -प्रिंट 0 | xargs -0 -I {} sh -c 'echo -e $ (ढूंढें "{}" | wc -l) "{}"' | sort -n' –

+1

मैंने इसे थोड़ा सा संशोधित किया है और यह मेरे लिए काफी अच्छा काम करता है: 'ढूंढें। -मैक्सडेपथ 1-प्रकार डी -प्रिंट 0 | xargs -0 -I {} sh -c 'echo $ (ढूंढें {} | wc -l) \\ t {}' | sort -rn | कम – Wizek

6

आप त्रुटि मामलों से बचने के लिए चाहते हैं, wc -l की अनुमति नहीं है नई-पंक्तियों के साथ फ़ाइलें (जो इसे के रूप में 2 + फ़ाइलें गणना की जाएगी)

जैसे देखने के लिए एक मामले पर विचार करें जहां हम कम से कम gnu wc चूंकि यह

> mkdir emptydir && cd emptydir 
> touch $'file with EOL(\n) character in it' 
> find -type f 
./file with EOL(?) character in it 
> find -type f | wc -l 
2 

में एक भी EOL चरित्र के साथ एक एकल फाइल है/पढ़ एक अशक्त सूची समाप्त गिनती (एक फ़ाइल से छोड़कर) करने का विकल्प भी प्रतीत नहीं होता है, सबसे आसान समाधान सिर्फ फाइलनामों को पास नहीं करना होगा, लेकिन फ़ाइल को हर बार एक स्थिर आउटपुट मिलेगा, उदाहरण के लिए

> find -type f -exec printf '\n' \; | wc -l 
1 

ऊपर या अगर उसी निर्देशिका में अपने find इसका समर्थन करता है

> find -type f -printf '\n' | wc -l 
1 
0

आप की कोशिश कर सकते:

find `pwd` -type f -exec ls -l {} ; | wc -l 
11

जवाब में से कई का मेल यहाँ एक साथ, सबसे अधिक उपयोगी समाधान लगता है होने के लिए:

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' | sort -n 

यह अजीब चीजों को फ़ाइल नामों जैसे संभाल सकता है जिसमें रिक्त स्थान कोष्ठक और यहां तक ​​कि नई लाइनें भी शामिल हैं। यह फ़ाइलों की संख्या से आउटपुट भी प्रकार करता है।

आप उप-निर्देशिकाओं को गिनने के लिए -मैक्सडेप के बाद संख्या भी बढ़ा सकते हैं। ध्यान रखें कि यह संभावित रूप से एक लंबा समय ले सकता है, विशेष रूप से यदि आपके पास उच्च-मैक्सडेप संख्या के साथ संयोजन में अत्यधिक घोंसला वाली निर्देशिका संरचना है।

0

मैं प्रारूप के लिए फ़िल्टरिंग के साथ एक अलग दृष्टिकोण देना चाहता हूं। उदाहरण सभी उपलब्ध कोड़ना कर्नेल मॉड्यूल में गिना जाता है:

ls -l /boot/grub/*.mod | wc -l

24

अपने कंप्यूटर पर, rsync एक छोटा सा स्वीकार किए जाते हैं जवाब में find | wc -l से तेज है। उदाहरण के लिए आप /Users/joe/ इस तरह में फ़ाइलों को भरोसा कर सकते हैं:

[joe:~] $ rsync --stats --dry-run -ax /Users/joe/ /xxx 

Number of files: 173076 
Number of files transferred: 150481 
Total file size: 8414946241 bytes 
Total transferred file size: 8414932602 bytes 

दूसरी पंक्ति फ़ाइलों की संख्या, ऊपर के उदाहरण में 150,481 है। बोनस के रूप में आपको कुल आकार भी मिलता है (बाइट्स में)।

टिप्पणी:

  • पहली पंक्ति फ़ाइलें, निर्देशिका, सिमलिंक, आदि सभी की गिनती एक साथ क्यों यह दूसरी पंक्ति से बड़ा है कि है।
  • --dry-run (या -n संक्षिप्त के लिए) विकल्प वास्तव में फ़ाइलों को स्थानांतरित करने के लिए महत्वपूर्ण नहीं है!
  • /xxx पैरामीटर कोई खाली या गैर मौजूदा फ़ोल्डर हो सकता है। यहां / का उपयोग न करें।
  • मैंने -x विकल्प "फाइल सिस्टम सीमाओं को पार न करें" के लिए उपयोग किया है, जिसका अर्थ है कि यदि आप इसे / के लिए निष्पादित करते हैं और आपके पास बाहरी हार्ड डिस्क संलग्न हैं, तो यह केवल रूट विभाजन पर फ़ाइलों को गिनती होगी।
+0

मुझे यहां rsync का उपयोग करने का आपका विचार पसंद है। मैंने कभी इसके बारे में सोचा नहीं होगा! – Qeole

+0

धन्यवाद @ क्यूओल, विचार मेरा नहीं है हालांकि। मैंने इसे कई साल पहले कहीं पढ़ा था कि rsync बहुत सारी फाइलों और उपफोल्डर वाले फ़ोल्डर को हटाने का सबसे तेज़ है, इसलिए मैंने सोचा कि यह फ़ाइलों को गिनने के लिए भी जल्दी हो सकता है। – psmith

+0

ने कोशिश की। एफएस कैश को पॉप्युलेट करने के लिए पहले से दो बार दौड़ने के बाद, 'ढूंढें ~ -प्रकार एफ | wc -l' ने 1.7/0.5/1.33 सेकंड (वास्तविक/उपयोगकर्ता/sys) लिया। 'rsync --stats --dry-run -ax ~/xxx' ने 4.4/3.1/2.1 सेकंड लिया। यह एसएसडी पर लगभग 500,000 फाइलों के लिए है। – slim

0

ls -l | grep -e -x -e -dr | WC -l

1. लंबे सूची 2.filter फ़ाइलों और dirs 3.count फ़िल्टर्ड लाइन नहीं

0

कई सही यहाँ जवाब नहीं है। यहाँ एक और है!

find . -type f | sort | uniq -w 10 -c 

जहां . फ़ोल्डर में और 10 देखने के लिए है जिसके द्वारा समूह निर्देशिका के लिए वर्णों की संख्या है।

0

मैंने विशिष्ट परिस्थितियों में रिकर्सिव फ़ाइल गिनती को तेज करने के लिए ffcnt लिखा है: रोटेशनल डिस्क और फाइल सिस्टम जो सीमा मैपिंग का समर्थन करते हैं।

यह ls या find आधारित दृष्टिकोण से तीव्रता का क्रम हो सकता है, लेकिन वाईएमएमवी।

0
बैश के साथ

:

साथ प्रविष्टियों की एक सरणी बनाएँ() और # साथ गिनती मिलता है।

FILES=(./*); echo ${#FILES[@]} 

ठीक है कि फ़ाइलों को दोबारा गिनती नहीं करता है लेकिन मैं पहले सरल विकल्प दिखाना चाहता था। फ़ाइल के रोलओवर बैकअप बनाने के लिए एक सामान्य उपयोग केस हो सकता है। यह logfile.1, logfile.2, logfile.3 आदि

CNT=(./logfile*); mv logfile logfile.${#CNT[@]} 

फ़ाइलों की गिनती प्राप्त करने के लिए रिकर्सिवली हम अभी भी उसी तरह से खोजने के उपयोग कर सकते हैं।

FILES=(`find . -type f`); echo ${#FILES[@]} 
0

find -type f | WC -l

या (वर्तमान निर्देशिका हैं निर्देशिका है)

खोज। -प्रकार एफ | wc -l

संबंधित मुद्दे