我在运行 SMB 版本的 Linux 操作系统上遇到问题,如果共享文件夹中目录的绝对路径为大于 1024 字节,且文件名部分大于 256 字节SMB 服务崩溃并锁定所有其他网络访问服务(如 SSH 和 FTP),导致机器静音。
为了防止系统崩溃,我临时移动了一组文件夹,我认为问题路径可能位于共享文件夹之外。我需要找到超出此限制的文件和文件路径,然后重命名或删除它们,以便我将大量文件返回到共享文件夹。
我试过了寻找和grep命令均未成功。是否有一系列命令或脚本可用于查找有问题的文件和目录?
请指教。
答案1
这是用 Bash 编写的,并使用了 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
这只是一个我没有测试过但它应该可以在 bash 和 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}'