[英]print recursively the number of files in folders
我努力工作了幾個小時才能使這條堅固的線工作
wcr() { find "$@" -type d | while read F; do find $F -maxdepth 0 && printf "%5d " $(ls $F | wc) && printf "$F"; done; echo; }
這是結果
39 41 754 ../matlab.sh
1 1 19 ./matlab.sh./micmac
1 1 14 ./micmac
我的第一個問題是:我怎么能更聰明地編寫它?
第二個問題:我想在計數之前打印名稱,但我不知道如何將輸出制成表格,因此我不能做得更好:
.
./matlab.sh 1 1 19
./matlab.sh./micmac 1 1 19
./micmac 1 1 14
find $F -maxdepth 0
有什么好處,所以我將其剝離。 %
,則將它用作printf
的格式字符串時會遇到麻煩,因此我要添加一個顯式的格式字符串。 然后將兩個printf
結合在一起。 要切換列(有關此主題的更多信息,請參見下文),只需切換參數並相應地調整格式字符串即可。 "$F"
而不是$F
),以避免文件名中包含空格或其他內容的問題。 read
將跳過那些空格,從而導致結果變量無用。 為避免這種情況,請在讀取時將IFS
設置為空字符串。 wc
使用選項-l
僅計算行數 (而不是單詞和字符)。 --sort=none
以ls
通過避免無用的排序,以加快東西。 -b
到ls
逃脫文件名換行字符,從而避免破壞計數。 結果如下:
wcr() {
find "$@" -type d | while IFS='' read F
do
printf "%5d %s\n" "$(ls --sort=none -b "$F" | wc -l)" "$F"
done
echo
}
我反對切換列。 可能最寬的列應位於末尾(在這種情況下,是文件的路徑)。 否則,您將不得不承受無法讀取的輸出。 但是,如果您確實要執行此操作,則必須執行兩次操作:一次確定最長的條目,第二次確定相應的格式。
for i in $(find . -type d); do
printf '%-10s %s\n' "$(ls $i | wc -l)" "$i"
done
您可能可以對輸出進行預處理,並使用column以任何順序生成一些更奇特的輸出,但是由於路徑可能變大,因此這樣做可能會更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.