Bash

遞歸查找最大文件

  • February 9, 2021

我正在嘗試以遞歸方式查找目錄中最大的文件。如果該目錄中有子目錄,則該函式需要進入該目錄並檢查是否存在最大的文件。一旦找到最大的文件,輸出就會顯示相對路徑名以及最大文件的名稱和大小。

前任:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

這就是我所擁有的:

#!/bin/sh
clear

recursiveS() {
   for d in *; do
       if [ -d $d ]; then
           (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
       fi
   done
}
recursiveS

我已經被困了一段時間了。我無法通過流水線化許多現有的 Unix 工具來實現這一點。任何想法都會很好!

使用find(這裡假設 GNU find)輸出具有文件大小的文件名。種類。列印出最大的一個。

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

假設文件路徑不包含換行符。


bash在 GNU 實現中使用循環stat

shopt -s globstar
max_s=0
for f in **; do
 if [[ -f "$f" && ! -L "$f" ]]; then
   size=$( stat -c %s -- "$f" )
   if (( size > max_s )); then
     max_s=$size
     max_f=$f
   fi
 fi
done
echo "$max_s $max_f"

這將比 find 解決方案慢得多。這還假設文件名不以換行符結尾,並且將跳過隱藏文件並且不會下降到隱藏目錄。

如果-目前目錄中有一個文件被呼叫,將考慮在標準輸入上打開的文件的大小。

請注意,bash在下降目錄樹時,4.3 之前的版本會跟隨符號連結。

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