私が使う ls -l *.filetype | wc -l
ですが、現在のディレクトリでのみファイルを検索できます。
サブディレクトリで特定の拡張子を持つすべてのファイルを数えるにはどうすればよいですか?
どうもありがとうございました。
find
コマンドでそれを行うことができます:
find . -name "*.filetype" | wc -l
次の複合コマンドは、多少冗長ではありますが、 改行を含むファイル名 を正しく処理するため、正確なカウントが保証されます。
total=0; while read -rd ''; do ((total++)); done < <(find . -name "*.filetype" -print0) && echo "$total"
注:前述の複合コマンドを実行する前に:
cd
特定の拡張子を持つすべてのファイルをカウントするディレクトリに。filetype
の部分を適宜変更します。 txt
デモ:
find
の結果を wc -l
にパイプして誤った結果が生成される理由をさらに示すには、次のようにします。
次の複合コマンドを実行して、いくつかのテストファイルをすばやく作成します。
mkdir -p ~/Desktop/test/{1..2} && touch ~/Desktop/test/{1..2}/a-file.txt && touch ~/Desktop/test/{1..2}/$'b\n-file.txt'
これにより、「デスクトップ」に次のディレクトリ構造が作成されます。
test
├── 1
│ ├── a-file.txt
│ └── b\n-file.txt
└── 2
├── a-file.txt
└── b\n-file.txt
注:合計4つの.txt
ファイルが含まれています。その2つには複数行のファイル名があります。つまり、b\n-file.txt
。
MacOSの新しいバージョンでは、b\n-file.txt
という名前のファイルは "Finder"でb?-file.txt
として表示されます。つまり、疑問符は複数行の改行を示します行のファイル名
次に、find
の結果をwc -l
にパイプする次のコマンドを実行します。
find ~/Desktop/test -name "*.txt" | wc -l
それ誤ってレポート/印刷:
6
次に、次の推奨される複合コマンドを実行します。
total=0; while read -rd ''; do ((total++)); done < <(find ~/Desktop/test -name "*.txt" -print0) && echo "$total"
それ正しくレポート/印刷:
4