シェルスクリプトの特定のディレクトリにあるファイルとディレクトリの数

シェルスクリプトの特定のディレクトリにあるファイルとディレクトリの数

私はLinuxを使用していますが、それは私にとって新しいものです。シェルスクリプトを作成しましたcountfiledirs。特定のディレクトリにあるファイルとディレクトリの数を知りたいです。

私のコードは次のとおりです

#!/bin/bash
echo "total directories:" `find . -type d | wc -l`

echo "total files:" `find . -type f | wc -l`

このコマンドを実行すると、次のように表示されます。./countfiledirs

total directories: 148
total files: 255 

このコマンドを使用すると、どのくらいのディレクトリとファイルがあるかを知りたいと思います./countfiledirs /usr/share

答え1

wc -lファイルとディレクトリの名前には改行文字を含めることができるため、今のように「ただ」使用することはできません。

引数を受け入れ、ファイル数とディレクトリ数を繰り返し計算するスクリプトが必要な場合は、次のようにします。

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -printf \\n | wc -l
echo -n 'total files:';  find "$1" -type f -printf \\n | wc -l

次に、ディレクトリをコマンドライン引数として指定してスクリプトを呼び出します。

./your_script_name /home/e_g_your_home_dir.

簡単に言えば、上記はディレクトリですが(ディレクトリ自体を「ディレクトリ」と見なさない限り)、wc -lNULで終わる「行」を処理し、次を使用できるものに置き換えることもできます。-print0

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-2"
echo -n 'total files:';  find "$1" -type f -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-1"

この操作を繰り返し実行したくない場合は、(指定したディレクトリのファイル/ディレクトリを計算せずに指定したディレクトリのファイル/ディレクトリのみを計算する)、引数の後に追加する必要があり-maxdepth 1ます$1

答え2

コマンドラインで最初の引数を受け入れる必要があります$1。理想的には変数に割り当てることをお勧めしますDIR="$1"。何も指定されていない場合は、現在のディレクトリをデフォルトとして使用したいようです.。 orを使用してこれを行うことができtest -z "$DIR" && DIR='.'、より慣用的な方法は変数を使用してデフォルト値を提供することです"${DIR:-.}"

それらを組み合わせると、次のような結果が得られます。

#!/bin/bash
DIR="$1"

echo "total directories: $(find "${DIR:-.}" -type d -ls | wc -l)"
echo "total files: $(find "${DIR:-.}" -type f -ls | wc -l)"

しかし、あなたが投稿した元のコード(質問を編集する前)は機能しませんでした。

echo "total directories:" find . -type d | wc -l

find . -type d | wc -lバックティックに入れるか、`...`より良い方法でコンストラクタに入れる必要があります$( ... )。ここでは2番目の方法を使用しました。単純なケースでは同じかもしれませんが、$( ... )一般的にはより強力です。

関連情報