
我在運行 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}'