簡體   English   中英

遞歸打印文件夾中的文件數

[英]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 
  1. 我看不出find $F -maxdepth 0有什么好處,所以我將其剝離。
  2. 另外,如果文件名包含% ,則將它用作printf的格式字符串時會遇到麻煩,因此我要添加一個顯式的格式字符串。 然后將兩個printf結合在一起。 要切換列(有關此主題的更多信息,請參見下文),只需切換參數並相應地調整格式字符串即可。
  3. 您應該在使用變量時使用雙引號( "$F"而不是$F ),以避免文件名中包含空格或其他內容的問題。
  4. 然后,如果文件以空格開頭,則您的read將跳過那些空格,從而導致結果變量無用。 為避免這種情況,請在讀取時將IFS設置為空字符串。
  5. 要僅獲取目錄條目的數量,應該對wc使用選項-l僅計算行數 (而不是單詞和字符)。
  6. 使用選項--sort=nonels通過避免無用的排序,以加快東西。
  7. 使用選項-bls逃脫文件名換行字符,從而避免破壞計數。
  8. 如果您希望其他人閱讀代碼,請正確縮進代碼。

結果如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM