我在运行SMB的版本的Linux操作系统上遇到问题,如果共享文件夹中的目录的绝对path大于1024字节且文件名组件大于256字节,则SMB服务会崩溃并locking所有其他服务networking访问,SSH和FTP渲染机器静音。
为了让系统崩溃,我暂时移动了一组我认为问题path可能位于共享文件夹之外的文件夹。 我需要find超出此限制的文件和文件path,并将其重命名或删除,以便将大量文件返回到共享文件夹。
我已经尝试了find和grep命令,但没有成功。 是否有一串命令或脚本,我可以用来追捕有问题的文件和目录?
请指教。
这是写在Bash中,并使用特定的function(但在其他shell中可用类似的function)。 它的devise目的是从所有感兴趣的文件和目录的父目录运行。它考虑从/到那里的path的长度,并将其添加到每个评估path的长度。 如果你不想这样做,只需使用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
不知道我是否理解你的正确,但首先尝试:
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
这仅仅是一个我不想testing的工作而是应该工作在一个bash-equlas-shell脚本中。 随意添加错误检查和其他有用的东西…
这是一个单行输出的dirname长度,然后是基地名长度,然后是dirname,最后是基地名(为后代)。 我只是使用当前的工作目录,但是这可以改变。 这也可以扩大到拉出大于你的条件的值。
find `pwd` -exec dirname '{}' \; -exec basename '{}' \; | awk '( NR%2 != 0){printf("%s ",$0);next}1 ' | awk '{print length($1)" "length($2)" "$1$2}'
更新:
按照dirname长度sorting,将其添加到最后:
| sort -nr
要按基本名称长度sorting,请将其添加到末尾:
| 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}'