Puncte:4

Count number of files with specific extension(s) for each subdirectory

drapel mx

Source: Any directory tree with any number and type of files. Q: How many .jpg or .jpg and .png (for example) are in each subdirectory?

How can I limit the code below for files with 1 or more specific extension(s)? Having trouble inserting the -type f -name "*.jpg*", for example.

for DIR in $(find . -maxdepth 99 -type d)
do
    printf "%10d\t%s\n" $(find ${DIR}|wc -l) "${DIR}" 
done

Desired output:

118   ./aaa
 73   ./aaa/bbb
 16   ./aaa/bbb/ccc

If more than one file types are counted, then their combined total number in each subdirectories should be displayed.

Liso avatar
drapel sd
Doriți să combinați rezultatul `.jpg` și `.png`?
Puncte:4
drapel cn

Probabil asta găsi|xargs soluția va funcționa după cum aveți nevoie.

găsi . -mindepth 1 -maxdepth 99 -tip d -print0 | \
   xargs -0 -i bash -c 'printf "%10d\t%s\n" "$(găsiți "$1" -maxdepth 1 -type f -regextype awk -iregex ".*\.(jpg|jpeg|png) " | wc -l)" "$1"' - '{}'

Cateva explicatii:

  • The -profunzimea mintii 1 este adăugată opțiunea pentru a sări peste directorul curent și a procesa doar subdirectoarele.
  • The -print0 furnizează intrările de ieșire cu delimitator nul, funcționează împreună cu -0 opțiunea de xargs.
  • Optiunea - "{}" la final va trece xargs argument ca valoare a primului parametru pozițional $1 a comenzii bash.
  • În cadrul celui de-al doilea găsi comanda -iregex înseamnă expresie regulată care nu ține seama de majuscule și minuscule (ați putea folosi -regex in schimb).
user3026965 avatar
drapel mx
elegant! Există o modalitate ușoară de a suprima listarea acelor subdir-uri în care numărul = 0? (de exemplu, niciun fișier care să se potrivească cu `*\.(jpg|jpeg|png)"`).
pa4080 avatar
drapel cn
Bună, @user3026965, cel mai simplu mod de a suprima aceste linii este prin adăugarea `| grep -Pv '^\s+0'` la sfârșitul comenzii. Opțiunea `-P` activează expresiile regulate extinse, `-v` suprimă liniile potrivite și regex-ul în sine înseamnă o linie care începe `^` cu unul sau mai multe `+` spații albe `\s` urmate de `0`.
Puncte:3
drapel sd

Iată din al meu, modificat din acest raspuns.

găsi . -maxdepth 100 -tip d -print0 | while read -d '' -r dir; do count=$(găsi "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -ls | wc -l); printf "%5d %s\n" "$count" "$dir"; Terminat

Returnați acest lucru în directorul meu de testare.

20 .
11 ./nivel2
3 ./level2/level3

Unde este conținutul:

$ arbore -L 3 nivel1/
nivelul 1/
âââ 1.png
âââ 10.png
âââ 11.png
âââ 12.png
âââ 13.png
âââ 14.png
âââ 15.png
âââ 16.jpg
âââ 17.jpg
âââ 18.jpg
âââ 19.jpg
âââ 2.png
âââ 20.jpg
âââ 3.png
âââ 4.png
âââ 5.png
âââ 6.png
âââ 7.png
âââ 8.png
âââ 9.png
ââânivel2
    âââ 20.jpg
    âââ 21.jpg
    âââ 22.jpg
    âââ 23.jpg
    âââ 24.jpg
    âââ 25.jpg
    âââ 26.png
    âââ 27.png
    âââ 28.png
    âââ 29.png
    âââ 30.png
    âââ nivelul3
        âââ bull_city.png
        âââ om_oraş.png
        âââ newyork_city.png

2 directoare, 34 de fișiere

găsi . -mindepth 1 -maxdepth 100 -tip d -print0 | while read -d '' -r dir; do count=$(găsi "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -ls | wc -l); printf "%5d %s\n" "$count" "$dir"; Terminat

Returnează asta.

11 ./nivel2
3 ./level2/level3
Puncte:1
drapel it

Find are operatori logici precum AND, NOT și SAU.

Pentru a specifica mai multe extensii de căutat, trebuie să puneți argumentele în paranteze, precum și să evadați din paranteze pentru a evita procesarea lor de către bash:

găsi . \( -type f -nume „*.jpg” -o -nume „*.png” \)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.