查找Linux文件系统中文件的长度和目录结构的文件路径

查找Linux文件系统中文件的长度和目录结构的文件路径

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

相关内容