尋找Linux檔案系統中目錄結構的檔案長度和檔案路徑

尋找Linux檔案系統中目錄結構的檔案長度和檔案路徑

我在運行 SMB 版本的 Linux 作業系統上遇到問題,其中共享資料夾中目錄的絕對路徑是大於 1024 位元組且檔案名稱部分大於 256 位元組SMB 服務崩潰並鎖定所有其他網路存取服務,例如 SSH 和 FTP,從而使電腦靜音。

為了防止系統崩潰,我暫時移動了一組資料夾,我認為問題路徑可能位於共用資料夾之外。我需要找到超出此限制的文件和文件路徑並重命名它們或刪除它們,以便我將大量文件返回到共用資料夾。

我已經嘗試過尋找grep命令沒有成功。是否有一系列命令或腳本可用於查找有問題的檔案和目錄?

請指教。

答案1

這是用 Bash 編寫的,並使用特定於它的功能(但在其他 shell 中也有類似的功能)。它被設計為從您感興趣的所有檔案和目錄共有的父目錄運行/。如果您不想這樣做,只需使用lenpwd=0而不是lenpwd=${#PWD}.如果檔案名稱中包含空格但不包含換行符(應該以任何方式消除),則它將起作用。它會列印它發現的符合條件的任何內容的長度和文件規範。

lenpwd=${#PWD}; find | while read -r path; do file=${path##*/}; if (( ${#path} + lenpwd > 1024 || ${#file} > 256 )); then echo "$((${#path} + lenpwd)) ${#file} $path"; fi; done

答案2

我不知道我理解是否正確,但第一次嘗試:

for f in $( find /srv/smb -type f )
do
  fname=$( basename "$f" )
  pname=$( dirname "$f" )

  l_fname=$( echo "$fname" | wc -c )
  l_pname=$( echo "$pname" | wc -c )

  if [ $l_fname -gt 256 ] ; then
    # do somthing with $f when filename > 256b
    rm -- "$f"
    continue
  fi

  if [ $l_pname -gt 1024 ] ; then
    # do something if path > 1024
    echo "$f much too long!"
  fi
done

這只是一個 i-didnt-test-it-but-it-should-work-in-bash-an-equlas-shell 腳本。請隨意添加錯誤檢查和其他有用的東西...

答案3

這是一個單行程式碼,它輸出目錄名長度,然後是基本名稱長度,然後是目錄名,最後是基本名稱(用於後代)。我只是使用當前工作目錄,但這可以更改。這也可以擴展為提取比您給定的值更大的值。

find `pwd` -exec dirname '{}' \; -exec basename '{}' \;
 | awk '( NR%2 != 0){printf("%s ",$0);next}1 '
 | awk '{print length($1)" "length($2)" "$1$2}'

更新:

若要按目錄名長度排序,請將其加到末尾:

 | sort -nr

若要按基本名稱長度排序,請將其新增至末尾:

 | sort -nr -k2

更新2:

根據作者的評論,這會將空格更改為 +,然後使其與計數一起使用。

find `pwd` -exec dirname '{}' \; -exec basename '{}' \;
 | tr '[:blank:]' '+'
 | awk '( NR%2 != 0){printf("%s ",$0);next}1 '
 | awk '{print length($1)" "length($2)" "$1$2}'

相關內容