Bash
計算給定目錄中的文件、目錄等並在螢幕上格式化輸出
剛開始一個腳本類,可以使用一些幫助。我正在編寫一個腳本來檢查給定目錄中每個文件和目錄的文件名,並累積每個文件、子目錄、符號連結、舊文件、圖形文件、tmp 文件、exe 文件和每個文件的總字節數的計數在那個目錄中。
輸出需要以這種方式格式化:
- 目錄 n,nnn,nnn
- 文件 n,nnn,nnn
- ETC…
當我執行我的腳本時,它似乎沒有計算任何東西,因為所有計數項目都返回 0。我也遇到了將數字格式化為逗號的問題。$1 是使用者在執行腳本時輸入的搜尋目錄,即:./srpt /etc。為了執行搜尋,我使用 find 命令和 printf 來格式化輸出並將輸出通過管道傳輸到 wc 以計算行數。我認為這會給我授予文件名的文件數只有一行。可能有十億種方法可以做到這一點,這種方法可能不是最優雅的,但我會感謝任何人的意見。
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)
ETC…
#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
您需要將命令更改為以下形式:
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
發生錯誤是因為您混淆了兩個不同的命令 - bash
printf
和 find-printf
。對於查找的
-printf
格式"%'d"
不正確。單引號是不允許的,%d
它是目錄樹中文件的深度。您可以在 中找到所有-printf
選項man find
,方法是鍵入:/printf format
。順便說一句,它需要添加
\n
到printf
(bash’s 和 find’s):"%d\n"
中,否則它們將在一行中列印所有輸出。