スクリプト処理を始めたばかりで、助けが必要です。私は、指定されたディレクトリ内のすべてのファイルとディレクトリのファイル名を確認し、すべてのファイル、サブディレクトリ、シンボリックリンク、古いファイル、グラフィックファイル、tmpファイル、exeファイル、および各ファイルの数を累積するスクリプトを作成しています。このディレクトリのバイト数。
出力形式は次のように指定する必要があります。
- ディレクトリn、nnn、nnn
- ファイルn、nnn、nnn
- など...
スクリプトを実行すると、すべてのカウント項目が0を返すため、何も計算されないようです。また、数値をカンマで書式設定する際にも問題があります。 $ 1は、スクリプトの実行時にユーザーが入力する検索ディレクトリです(例:./srpt /etc)。検索を実行するには、findコマンドとprintfを使用して出力形式を指定し、出力をwcにパイプして行数を計算しました。私はこれがファイル名に1行だけ与えるファイルの数を与えると思いました。これを行うには、おそらく何十億ものものがあり、この方法が最もエレガントではないかもしれませんが、誰にでもコメントしてください。
if [ -d "$1" ]; then
directories=$(find "$1" -type d -printf "%'d" | wc -l)
files=$(find "$1" -type f -printf "%'d" | wc -l)
sym=$(find "$1" -type l -printf "%'d" | wc -l)
など...
#Printing the output to the terminal
echo "Directories" $directories
echo "Files" $files
echo "Sym links" $sym
exit 0
else
echo "[ERROR]: need path to perform search"
exit 1
fi
私の結果:
Directories 0
Files 0
Sym Links 0
答え1
コマンドを次の形式に変更する必要があります。
directories=$(printf "%'d\n" $(find "$1" -type f | wc -l))
printf
現在のロケールの千単位の区切り記号を使用してください。区切り文字は、カンマ、ドット、または何でもない場合があります。カンマを強制するには、ロケールを変更できます。
または、次の方法で実行できます。
if [ -d "$1" ]; then
directories=$(find "$1" -type d | wc -l)
files=$(find "$1" -type f | wc -l)
sym=$(find "$1" -type l | wc -l)
そしてecho
に交換printf
#Printing the output to the terminal
printf "%s %'d\n" "Directories" $directories
printf "%s %'d\n" "Files" $files
printf "%s %'d\n" "Sym links" $sym
printf
このエラーは、2つの異なるコマンド(bashとfind)を混同したために発生します-printf
。
ルックアップ-printf
形式が"%'d"
正しくありません。%d
ディレクトリツリーのファイルの深さを表す単一引用符は使用できません。次のように入力してすべての-printf
オプションを見つけることができます。man find
/printf format
しかし、両方とも(bashとfind)\n
に追加する必要があります。それ以外の場合は、すべての出力を1行に印刷します。printf
"%d\n"
答え2
-printf "%'d"
ここでは何もしないので、カウント結果はゼロになり、それを変更するために使用する必要があります-printf "%p\n"
。