විධාන රේඛාව භාවිතා කර නාමාවලියක ගොනු ගණනක් ලබා ගන්නේ කෙසේද?


219

මට ගොනු විශාල සංඛ්‍යාවක් සහිත නාමාවලියක් ඇත. lsගණන් කිරීම සඳහා ස්විචයක් මා දකින්නේ නැත . ලිපිගොනු ගණනක් ලබා ගැනීම සඳහා විධාන රේඛා මැජික් තිබේද?



tree . | tailහෝ tree -a . | tailසැඟවුණු ලිපිගොනු / ඩර්ස් ඇතුළත් කිරීම treeඔබට අවශ්‍ය නම් එය පුනරාවර්තනය වේ.
කෝඩිචාන්

Answers:


281

"ගොනුව" පිළිබඳ පුළුල් අර්ථ දැක්වීමක් භාවිතා කිරීම

ls | wc -l

(එය සැඟවුණු ලිපිගොනු ගණන් නොගන්නා බවත් ගොනු නාමවල නව රේඛා අක්ෂර අඩංගු නොවන බවත් උපකල්පනය කරයි).

සඟවා ගොනු ( 'වශයෙන් ඇතුළත් කිරීමට .හා ..) සහ නව පේළියකට යොමු කිරීමේ අක්ෂරය අක්ෂර සමග වැලැක්විමට ප්රශ්න, ආගමික ක්රමයකි:

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

හෝ පුනරාවර්තන ලෙස:

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

24
wc"වචන ගණන් කිරීමේ" වැඩසටහනකි. මෙම -lස්විචය රේඛා ගණන් කිරීමට එය හේතු වේ. මෙම අවස්ථාවේ දී, එය ප්‍රතිදානයේ රේඛා ගණනය කරයි ls. දී ඇති නාමාවලියක් සඳහා ලිපිගොනු සංඛ්‍යාවක් ලබා ගැනීමට මට ඉගැන්වූ ක්‍රමය මෙයයි.
සැන්ඩි

22
බවයි සටහන් කරුණාකර එක් කරන්න lsකරන්නේ ls -1මෙම ප්රතිදානය නල නම්.
lesmana

6
එය ඩිරෙක්ටරියක් තුළ සෑම දෙයක්ම ලබා නොගනී - ඔබට තිත් ලිපිගොනු මග හැරී ඇති අතර අමතර පේළි කිහිපයක් එකතු කරන්න. හිස් නාමාවලියක් තවමත් පේළි 1 ක් ලබා දෙනු ඇත. ඔබ අමතන්නේ නම් ls -la, ඔබට නාමාවලියෙහි පේළි තුනක් ලැබෙනු ඇත. ඔබට ඇතුළත් කිරීම් සහ ඇතුළත් කිරීම් ls -lA | wc -lමඟ හැරීමට අවශ්‍යය . කෙසේ වෙතත්, ඔබ තවමත් එකින් එක සිටිනු ඇත. ...

1
හිස් නාමාවලියක් මා වෙනුවෙන් 0 ලබා දෙයි
ජේම්ස් රෝත්

2
නමෙහි නව රේඛා සහිත ලිපිගොනු දෙගුණයක් නොවන නිවැරදි කරන ලද ප්‍රවේශයක් මෙය වනු ඇත: ls -q | wc -l- සැඟවුණු ලිපිගොනු තවමත් මෙම ප්‍රවේශය මගින් ගණන් නොගන්නා බවත්, නාමාවලි ගණන් කරනු ඇති බවත් සලකන්න.
godlygeek

35

ගොනුවේ පටු අර්ථ දැක්වීම සඳහා:

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

-maxdepth 1නැවත නැවත ගොනු ගණනය කිරීම සඳහා ඔබට මඟ හැරිය හැක (නැතහොත් අපේක්ෂිත උපරිම සෙවුම් ගැඹුර සඳහා එය සකසන්න).
user7089

1
ඔබ සතුව නව රේඛාවක් අඩංගු ගොනුවක් තිබේ නම්, මෙම ප්‍රවේශය එය දෙවරක් වැරදියට ගණන් ගනු ඇත.
godlygeek

7
නමෙහි නව find -maxdepth 1 -type f -printf "\n" | wc -l
රේඛා

+1 සැඟවුණු ලිපිගොනු සඳහා ඉඩ දෙන්න සහ නාමාවලි නොසලකා
හරින්න

15
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 - <number-one> | wc - <letter-l>


10
බොහෝ අනුවාද lsකරන්න -1ප්රතිදානය සඳහා ජල නල විට ස්වයංක්රීයව.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

3
Enn ඩෙනිස් සිත්ගන්නා සුළුය, යෙදුමකට එහි ප්‍රතිදානය පයිප්පයකට යන බව පැවසිය හැකි බව මම දැන නොසිටියෙමි.
xenoterracide

1
මෙම අනුවාදය වඩාත් පැහැදිලිව පෙනෙන බැවින් මම එය සංස්කරණය කළෙමි. ඔව්, ls එය නල මාර්ගයක් නම් -1 භාවිතා කරයි (එය උත්සාහ කරන්න: ls | cat), -1 සින්ටැක්ස් වඩාත් පැහැදිලිව පෙනේ.
ගේබ්.

3
enxenoterracide: Bash හි:[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

2
මගේ පරීක්ෂණ වලදී ගොනු නාමයන් වර්ග කිරීම වළක්වා ගැනීම සඳහා -f විකල්පය ලබා දීම සැලකිය යුතු වේගයකින් සිදු විය. අවාසනාවට ඔබේ ගොනු නාමවල නව රේඛා තිබේ නම් ඔබට තවමත් වැරදි පිළිතුරක් ලැබේ.
සැමුවෙල් එඩ්වින් වෝඩ්

12

ls/ wcයුගල භාවිතා කරමින් වඩාත්ම සම්පූර්ණ පිළිතුර විය හැකිය

ls -Aq | wc -l

ඔබට තිත් ගොනු ගණන් කිරීමට අවශ්‍ය නම්, සහ

ls -q | wc -l

නැතිනම්.

  • -Aතිත් ගොනු ගණනය කිරීම, නමුත් මඟ හැරීම .සහ ...
  • -qපසුබිම lsnongraphic චරිත වෙනුවට, විශේෂයෙන් පේලීයක් සමග ?, එක් එක් ගොනුව සඳහා ප්රතිදානය 1 රේඛාව කරමින්

lsපර්යන්තයෙන් එක් පේළියක ප්‍රතිදානය ලබා ගැනීමට (එනම් එය නල මාර්ගයෙන් තොරව wc), -1විකල්පය එකතු කළ යුතුය.

( lsකොරුටිල්ස් 8.23 ​​සමඟ පරීක්ෂා කරන ලද හැසිරීම )


2
ඔබ කී පරිදි, -1අවශ්ය නොවේ. ලෙස "එය ගොනු නාමය දී හිස් පේලි ගැන සිතට පුවරුවේ ප්රතිදානය සමග හසුරුවන" , මේ නිසා වේ -qස්විචය (ඔබ වෙනුවට භාවිතා කළ යුතු බව -bඑය අතේ ගෙන යා හැකි වන නිසා) වන -මුද්රිත නොවන ගොනු චරිත හා <ටැබ්> අක්ෂර එක් එක් උදාහරණයක් ලිවීම සඳහා "හමුදා <question-mark> ('?') අක්‍ෂරය ලෙස. ප්‍රතිදානය පර්යන්ත උපාංගයකට නම් පෙරනිමියෙන් ක්‍රියාත්මක කිරීම මඟින් මෙම විකල්පය ලබා දිය හැකිය. එබැවින් උදා: ls -Aq | wc -lසියලුම ලිපිගොනු / ඩර් ls -qp | grep -c /ගණන් කිරීම හෝ සැඟවුණු ඩර් වැනි දේ පමණක් ගණන් කිරීම ...
don_crissti

ඔබගේ ආදානයට ස්තූතියි. වෙත වෙනස් කරන -bලදි -q.
ෆ්‍රැක්ස්

12

මම du --inodesප්‍රයෝජනවත් බව සොයාගෙන ඇත , නමුත් එහි කුමන අනුවාදය අවශ්‍යදැයි මට විශ්වාස නැත du. එය භාවිතා විකල්ප ක්රම යොදාගත වඩා සැලකිය යුතු වේගයකින් විය යුතු findහා wc.

උබුන්ටු 17.10 හි පහත ක්‍රියා කරයි:

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

| sort -nrඅඩංගු ඉනෝඩ ගණන අනුව බැසයාම වර්ග කිරීම සමඟ ඒකාබද්ධ කරන්න .


8

වත්මන් නාමාවලියෙහි අවම වශයෙන් එක් සැඟවුණු ගොනුවක්වත් නොමැති බව ඔබ දන්නේ නම්:

set -- *; echo "$#"

මෙය පැහැදිලිවම ඕනෑම ලෝකයකට සාමාන්‍යකරණය කළ හැකිය.

ස්ක්‍රිප්ට් එකක, ස්ථානීය පරාමිතීන් නැවත ලිවීමේ සමහර විට අවාසනාවන්ත අතුරු ආබාධයක් ඇත. ඔබට උපසිරැසියක් භාවිතා කිරීමෙන් හෝ (බෝර්න් / පොසික්ස් අනුවාදය) වැනි ශ්‍රිතයක් සමඟ වැඩ කළ හැකිය:

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)ඒ යකා ගැලපෙන නොවන glob සම්බන්ධයෙන් කටයුතු (එනම්, එය ඇති ෙහයින්ද, නැවත එම නඩුව 0 තිබෙන වාසිය set *ද glob හිස් විය හැකි නම්, ක්රමය මෙය දුෂ්කර පරීක්ෂා අවශ්ය).

ගොනු නාමවල නව රේඛා අක්ෂර අඩංගු විය හැකි නම්, විකල්පයක් භාවිතා කිරීම $(ls -d ./* | grep -c /).

ගැලපෙන ලිපිගොනු විශාල ප්‍රමාණයක් තිබේ නම්, ගෝලීය ලැයිස්තුවක් ව්‍යාප්ත කිරීම මත යැපෙන ඕනෑම විසඳුමක් තර්ක ලැයිස්තුවක්ls සමඟ දීර් error දෝෂයක් සමඟ අසමත් විය හැකිය .


1
ස්ථානීය පරාමිතීන් 13,923 ක් නිර්මාණය කිරීමට ඔබට ඇත්තටම අවශ්‍යද? ඔබ ඔබේ දේශීය විචල්‍යය localහෝ එය තුරන් කළ යුතුය: eval $1=$#නැතහොත් භාවිතා echo $#කර කරන්න number_of_files=$(count_words *).
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

1
Enn ඩෙනිස්: කාරණයෙහි කොටසක් වූයේ දෙබලක වැළකී සිටීමයි. මම හිතන්නේ එය 21 වන සියවසේ ප්‍රශ්නයක් නොවේ. හරි, මම පිළිගන්නවා මම තවදුරටත් පොසික්ස් නොවන ෂෙල් වෙඩි ගැන තැකීමක් නොකරන නිසා මට තාවකාලික විචල්‍යය වළක්වා ගත හැකිව තිබුණි.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

ඔබ $#(සංස්කරණයට පෙර එය කර නොතිබුණි) එයින් එකක් අඩු කළේ ඇයි ?
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

Enn ඩෙනිස්: මම තවමත් දෙබලකින් වැළකී සිටිමි (හොඳයි, එය රවුටර වැනි මන්දගාමී CPU සහිත යන්ත්‍රවල වෙනසක් ඇති කරයි) සහ විචල්‍ය නමක් පසුකරමින් $1. ඉතින් මට ගණන් කිරීමට අවශ්‍ය වන්නේ පළමු පරාමිතිය නොවන පරාමිති ගණනයි. (මට shiftවිචල්ය නාමය වටා තබා ගත යුතු නිසා මට භාවිතා කළ නොහැක .) (ම්ම්, දැන් ඔබ පළමු පේළිය ගැන
ඇසුවොත්

Enn ඩෙනිස්: ඒ ගැන සිතා බලන්න, මම shiftඑය නිසි වේලාවට භාවිතා කළහොත් භාවිතා කළ හැකිය .
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '


4

රුක් විධානය ස්ථාපනය කිරීමෙන් පසුව ටයිප් කරන්න:

tree

ඔබට සැඟවුණු ලිපිගොනු අවශ්‍ය නම්:

tree -a

ඔබ ඩේබියන් / මින්ට් / උබුන්ටු ලිනක්ස් භාවිතා කරන්නේ නම්, ගස් විධානය ස්ථාපනය කිරීමට පහත විධානය ටයිප් කරන්න:

sudo apt-get install tree

ඩිරෙක්ටරි ගසෙහි උපරිම දර්ශන මට්ටම නියම කිරීම සඳහා -L විකල්පය භාවිතා කරයි. රුක් විධානය මඟින් ගොනු ගණන පමණක් නොව, නාමාවලි ගණනද ගණනය කරනු ලැබේ, ඔබ කැමති නාමාවලි ගසෙහි මට්ටම් සලකා බලයි.


මම ගස ටයිප් කරන විට, මා සිටින නාමාවලියෙහි තිරයට යම් ආකාරයක ගස් ප්‍රතිදානයක් ලබා ගත හැකි නමුත් ලිපිගොනු ගණන පෙන්වන ස්ථානය මට නොපෙනේ.
charlesdarwin

4
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 "$#"; }ප්‍රමාණවත් වේවි. IlGilles විසඳුමේ කාරණය වන්නේ විධාන ආදේශනය භාවිතා නොකිරීමට ආපසු හරවන ලද විචල්‍යයක ගණනය කිරීමයි (එයට ksh93 හැර වෙනත් කවචවල දෙබලක හා නළයක් සම්බන්ධ වේ).
ස්ටෙෆාන් චසෙලාස්

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

මෙය වත්මන් නාමාවලියෙහි ඇති ගොනු පමණක් ලැයිස්තු ගත කළ හැකිය.


find . -type fවත්මන් නාමාවලියෙහි ලිපිගොනු සොයාගනු ඇත, එසේම, පුනරාවර්තන ලෙස, උප නාමාවලි වල.
dhag

1

ලිනක්ස් හි, විධානය ඉතා ශක්තිමත් කිරීමට සහ ඒවායේ නමින් නව රේඛා තිබිය හැකි ගොනු හැසිරවීමට, මෙය භාවිතා කරන්න:

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

මෙය අපට ඉතිරි මුහුණ දුන් මාණකරනය ක්රියාත්මක වන lsප්රතිදාන.


ආශ්‍රිත:


0

මෙය උත්සාහ කරන්න මෙම පිළිතුර ඔබට උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි

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

0

ඔබට මෙය පරීක්ෂා කළ හැකිය:

ls -l | grep -v ^l | wc -l

0

මීට පෙර ලබා දී ඇති පිළිතුරු වැඩි දියුණු කිරීම, නමුත් මෙවර එය පැහැදිලිව කරයි.

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

වැනි tailසහ සමහර ආදරණීය විධානයන් භාවිතා කිරීම දැකීම වටී cut. ගස පෙරනිමියෙන් ලබා ගත නොහැකි බව සලකන්න. ඉහත විධානය මඟින් පළමු මට්ටමේ ඩිරෙක්ටරිය පිළිබඳ තොරතුරු ග්‍රහණය කර, පසුව 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

එසේනම්, නාමාවලි ගණන විමසීම ගැන කුමක් කිව හැකිද?


-2

treeවිධානය භාවිතා කරන්න ,

tree
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.