Bash

計算給定目錄中的文件、目錄等並在螢幕上格式化輸出

  • August 30, 2018

剛開始一個腳本類,可以使用一些幫助。我正在編寫一個腳本來檢查給定目錄中每個文件和目錄的文件名,並累積每個文件、子目錄、符號連結、舊文件、圖形文件、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)

並替換echoprintf

#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

發生錯誤是因為您混淆了兩個不同的命令 - bashprintf和 find -printf

對於查找的-printf格式"%'d"不正確。單引號是不允許的,%d它是目錄樹中文件的深度。您可以在 中找到所有-printf選項man find,方法是鍵入:/printf format

順便說一句,它需要添加\nprintf(bash’s 和 find’s):"%d\n"中,否則它們將在一行中列印所有輸出。

引用自:https://unix.stackexchange.com/questions/390806