फ़ाइल नाम के साथ फ़ाइल का आकार प्रिंट करने के लिए मुझे खोज आदेश कैसे मिलेगा?


106

अगर मैं निम्न आदेश जारी करता हूं:

$ find . -name *.ear

यह प्रिंट करता है:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

मैं कमांड लाइन पर 'प्रिंट' करना चाहता हूं, जिसका नाम और आकार है:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB

जवाबों:


109
find . -name '*.ear' -exec ls -lh {} \;

jer.drab.org के उत्तर से केवल h अतिरिक्त। एमबी को मानसिक रूप से परिवर्तित करने में समय बचाता है;)


8
यह संस्करण प्रत्येक फ़ाइल के लिए "ls" प्रक्रिया निष्पादित करेगा। यदि आपके पास कई फाइलें हैं (तो, एक हज़ार से अधिक) आप बेहतर तरीके से या तो इसे अनुकूलित करते हैं: find . -name '*.ear' -exec ls -lh {} + \;(GNU एक्सटेंशन) या find . -name '*.ear' -print0 | xargs -0 ls -lh-type fयदि आप केवल फाइलों में रुचि रखते हैं (या -dयदि आप अपनी सामग्री के बिना निर्देशिका को शामिल करना चाहते हैं तो ls में जोड़ें) आप भी जोड़ना पसंद कर सकते हैं ।
ash108

2
आपका जवाब निर्देशिकाओं को बाहर नहीं करता है, इसलिए आप निर्देशिकाओं पर चल रहे एलएस को समाप्त कर देंगे, जो स्पष्ट रूप से करने के लिए सही नहीं है।
फहीम मीठा

2
चीजों को करने का यह वास्तव में अक्षम तरीका है - और दुर्भाग्य से ash108 की टिप्पणियां भी आदर्श नहीं हैं। यह खोजने के लिए -printf विकल्प का उपयोग करना बेहतर है।
ऑस्करपर्सन

dmazzoni का उत्तर बहुत अधिक कुशल है क्योंकि यह प्रत्येक फ़ाइल पर कांटा + निष्पादन से बचता है (मेरी मशीन पर 100x तेज़)। मुझे% k को% s में बदलना था। @FaheemMitha: आप -type fकेवल नियमित फ़ाइलों को गिनने के लिए विकल्प जोड़ सकते हैं ।
श्री फ़ूज

@FaheemMitha find . -name "*.ear" -type fफ़ाइलों के लिए आसान समाधान है । -type dनिर्देशिकाओं के लिए काम करता है।
Anon58192932

111

आपको -exec या -printf का उपयोग करने की आवश्यकता है। Printf इस तरह काम करता है:

find . -name *.ear -printf "%p %k KB\n"

-exec अधिक शक्तिशाली है और आपको मनमाने आदेशों को निष्पादित करने देता है - इसलिए आप अन्य जानकारी के साथ फ़ाइल नाम को प्रिंट करने के लिए 'ls' या 'wc' के एक संस्करण का उपयोग कर सकते हैं। 'मैन फाइंड' आपको प्रिंटफ को उपलब्ध तर्कों को दिखाएगा, जो कि केवल फाइलों की तुलना में बहुत अधिक कर सकते हैं।

[संपादित करें] -printf आधिकारिक POSIX मानक में नहीं है, इसलिए जांचें कि क्या यह आपके संस्करण पर समर्थित है। हालांकि, अधिकांश आधुनिक सिस्टम GNU खोजने या इसी तरह विस्तारित संस्करण का उपयोग करेंगे, इसलिए एक अच्छा मौका है इसे लागू किया जाएगा।


ऐसा लगता है कि अपने उदाहरण की तरह और अधिक सटीक है, लेकिन मैं सोलारिस से 10 पर काम करने के लिए उदाहरण पाने के लिए नहीं कर पा रहे
ब्रायन

मुझे डर है कि सोलारिस का समर्थन नहीं करता है, -rf: jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks cs.bgu.ac.il/~arik/usail/man/solaris/ find.1.html आप GNU को स्थापित कर सकते हैं यदि आप परेशान हो सकते हैं, अन्यथा आपको निष्पादन या उपयोग करने की आवश्यकता है | जैसा कि दूसरों ने सुझाव दिया है।
लेह कैल्डवेल

1
+1 यह अधिक क्लीनर लगता है। आउटपुट को फॉर्मेट करने के लिए मैं एड columnकमांड जोड़ना पसंद करूंगा । find . -name *.ear -printf "%p %k KB\n" | column -t
अमोल

1
इस उत्तर स्वीकार किए जाते हैं जवाब से यह करने के लिए एक और अधिक सही तरीका है
menacingly

2
-printfविकल्प ओएस एक्स या तो में काम नहीं करता। Stackoverflow.com/questions/752818/… देखें ।
abeboparebop

33

एक सरल उपाय यह है कि मोती विकल्प का उपयोग करें:

find . -name \*.ear -ls

यह आपको सामान्य "ls -l" प्रारूप में प्रत्येक प्रविष्टि देता है। या, विशिष्ट उत्पादन पाने के लिए जिसे आप ढूंढ रहे हैं, यह है:

find . -name \*.ear -printf "%p\t%k KB\n"

जो आपको KB में आकार के बाद फाइल नाम देगा।


एक lsविकल्प के बारे में भी नहीं पता था , यह उत्तर की सूची की तुलना में कहीं अधिक ऊंचा होना चाहिए।
प्रोमेथियस

24

ग्नू खोज का उपयोग करते हुए, मुझे लगता है कि यह वही है जो आप चाहते हैं। यह सभी वास्तविक फ़ाइलों को ढूँढता है और डायरेक्टरी (-type f), और हर एक के लिए फ़ाइल नाम (% p), एक टैब (\ t), किलोबाइट्स में आकार (% k), प्रत्यय "KB" और फिर प्रिंट करता है। a newline (\ n)।

find . -type f -printf '%p\t%k KB\n'

यदि प्रिंटफ़ कमांड आपके इच्छित तरीके को चीजों को प्रारूपित नहीं करता है, तो आप निष्पादन का उपयोग कर सकते हैं, इसके बाद कमांड जिसे आप प्रत्येक फ़ाइल पर निष्पादित करना चाहते हैं। फ़ाइल नाम के लिए {} का उपयोग करें, और अर्धविराम (;) के साथ कमांड को समाप्त करें। अधिकांश गोले पर, उन सभी पात्रों को बैकस्लैश के साथ बच जाना चाहिए।

यहां एक सरल समाधान है जो "ls -lh" का उपयोग करके उन्हें खोजता है और प्रिंट करता है, जो आपको मानव-पठनीय रूप में आकार देगा (किलोबाइट के लिए k, मेगाबाइट के लिए):

find . -type f -exec ls -lh \{\} \;

अभी तक एक अन्य विकल्प के रूप में, "wc -c" फ़ाइल में वर्णों (बाइट्स) की संख्या प्रिंट करेगा:

find . -type f -exec wc -c \{\} \;

+1 -name '*.ear'उदाहरणों में छोड़े जाने के अलावा , यह # 1 उत्तर होना चाहिए। यह प्रश्न का सटीक उत्तर देता है, वाक्यविन्यास का अर्थ बताता है, और कई विकल्प देता है।
ओसाकावेबी

इसका उत्तर स्वीकार किया जाना चाहिए क्योंकि यह प्रत्येक पंक्ति के लिए नई कमांड नहीं चलाता है, इस प्रकार यह श्याम से वर्तमान में स्वीकृत एक से कहीं अधिक तेज है
jirislav

वास्तव में यह सही उत्तर होना चाहिए। इसके अलावा, find . -type f -printf '%k KB\t %p\n'अर्थात्, फ़ाइल आकार को पहले प्रिंट करना, संरेखण के कारण स्वरूपण के मामले में सबसे अधिक संभावना एक अच्छा उत्पादन होगा।
मिरादियो


4

Awk आउटपुट को ठीक करने के लिए ठीक कर सकता है जो प्रश्नकर्ता ने पूछा है। मेरे सोलारिस 10 सिस्टम पर, केएल का आकार दूसरे क्षेत्र के रूप में प्रिंट करता है, इसलिए:

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

अन्यथा, -exec ls -lh का उपयोग करें और आउटपुट से आकार फ़ील्ड चुनें। सोलारिस 10 पर फिर से:

% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear

4

डु-ए का उपयोग क्यों नहीं करते ? उदाहरण के लिए

find . -name "*.ear" -exec du -a {} \;

एक मैक पर काम करता है


3

मैं मैक ओएस एक्स पर इसके साथ संघर्ष किया जहां खोज आदेश का समर्थन नहीं करता है -printf

एक समाधान जो मैंने पाया, वह यह है कि सभी फाइलों के लिए 'समूह' पर निर्भर करता है कि 'स्टाफ' था ...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

यह ls लंबे आउटपुट को तीन टोकन में विभाजित करता है

  1. पाठ 'स्टाफ' से पहले सामान
  2. फ़ाइल का आकार
  3. फ़ाइल का नाम

और फिर टोकन 2 और 3 को आउटपुट करता है, यानी आउटपुट बाइट्स की संख्या और फिर फ़ाइल नाम

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php

1
यह जानने के लिए उपयोगी है .. का GNU संस्करण findbrew install findutils
होमबॉव के

2

यह आपको प्राप्त करना चाहिए कि आप क्या खोज रहे हैं, इसमें शामिल स्वरूपण (यानी फ़ाइल नाम पहले और आकार बाद में):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

नमूना उत्पादन (जहां मुझे -iname "*.php"कुछ परिणाम मिलता था):

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K

1

आप यह कोशिश कर सकते हैं:

find. -name *.ear -exec du {} \;

यह आपको बाइट्स में आकार देगा। लेकिन डू कमांड MB के लिए KB और -m के पैरामीटर -k को भी स्वीकार करता है। यह आपको जैसे आउटपुट देगा

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear



1

निम्नलिखित आदेश आज़माएँ:

GNU stat:

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

बीएसडी stat:

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

हालांकि statमानक नहीं है, तो duया wcएक बेहतर दृष्टिकोण हो सकता है:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'


0

यदि आपको कुल आकार प्राप्त करने की आवश्यकता है, तो यहां एक स्क्रिप्ट प्रस्ताव है

#!/bin/bash
totalSize=0

allSizes=`find . -type f -name *.ear -exec stat -c "%s" {} \;`

for fileSize in $allSizes; do
    totalSize=`echo "$(($totalSize+$fileSize))"`
done
echo "Total size is $totalSize bytes"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.