複数フォルダ内のファイル数の計算(ファイル拡張子に基づく)

複数フォルダ内のファイル数の計算(ファイル拡張子に基づく)

たとえば、説明するのが最善だと思います。

parent1 (located inside /home/myuser
  - folder1
    - test11.png
    - test11.txt
    - folder11
      - test111.png
    - folder12
      - test121.png
      - test122.png
  - folder2
    - test21.png

台本を書けたら

get-number-of-files-per-folder "parent" png

出力は次のようになります。

folder1: 4
folder2: 1

現在、このコマンドを使用していますが、リストしたファイル拡張子だけでなく、すべてのファイルを計算しているようです。

find /home/myuser/parent -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -iname "*png" -type f | wc -l)" file\(s\)' \;

これが間違っているかどうかはどうすればわかりますか?私がこれを実行するとき

find /home/myuser/parent -iname '*jpg' -type f | wc -l

JPGファイルがないことがわかりますが、上記のスクリプトでは、フォルダにxx個のファイルがあることがわかります。

答え1

簡単なシェルスクリプト方法:

#!/bin/sh

if [ "$#" -ne 2 ]; then
    echo "Usage: $0 directory extension" >&2
    exit 1
fi
cd "$1" || exit 1
for d in *; do
    [ -d "$d" ] || continue
    printf "%s: %i\n" "$d" \
        "$(find "$d" -type f -name "*.$2" -printf '1\n' | wc -l)"
done

...シェルを使用して、ターゲットディレクトリのすべてのファイル/ディレクトリを繰り返します(もちろん、始まる隠しファイル/ディレクトリを除く.)。ディレクトリ以外のエントリは無視され、ディレクトリの場合は名前とファイル数(およびfindを使用して取得wc)を印刷します。このように、find … -printf '1\n'findは1見つかったすべてのファイルを印刷します。ファイル名を印刷しないと、ファイル名の改行などのすべての問題を回避できます。行数だけ数えます。それがすべてです。

答え2

GNUを想定しfind、ファイル名に改行文字が含まれていないとします。

find /path/to/parent1 -mindepth 2 -type f -iname '*.png' -printf '%P\n' | \
    sed 's#/.*##' | \
    sort | \
    uniq -c

答え3

探す+アッ現在のフォルダ構造の方法/home/myuser/parent1/<folder>

find /home/myuser/parent1 -type f -name "*.png" \
     | awk -F'/' '{ a[$5]++ }END{ for(i in a) print i,a[i] }'
  • $5- 必要なレベルを指すフォルダ名(フォルダ構造が異なる場合は、この名前を調整してください。親ディレクトリよりも深い2つのディレクトリである必要があります。したがって、です/tmp/parent1。)$4/home/myuser/Documents/parent1$6

関連情報