在 Windows 7 上,如何查找所有文件名太长的文件

在 Windows 7 上,如何查找所有文件名太长的文件

Dropbox 告诉我,许多文件无法同步,因为它们的名称超出了最大字符长度

https://www.dropbox.com/help/145/en

最大字符长度

Windows 仅允许文件和文件夹名称不超过 260 个字符。请注意,Windows 将文件路径计为名称的一部分,因此像 C:\Users\Panda\My Documents\Dropbox\Creative Nonfiction\My Autobiography\Favorite Things\Favorite Foods\Bamboo\Family Recipes\Fresh Leaves.doc 这样的文件将有 142 个字符,而不是 16 个字符。如果整个文件路径和名称超过 260 个字符,请缩短名称或将文件或文件夹移动到 Dropbox 中的更高级别文件夹。

如何查找目录下文件和文件夹名称大于 250 个字符的所有文件?

(注意:该页面上的“检查坏文件”工具也找不到它们。)

更新:到目前为止有两个建议,一个使用 powershell,但具有讽刺意味的是,当文件名太大时它就死机了,另一个使用 cygwin 的 find 和 xargs,虽然可能有效,但仍在运行(几分钟后)。

我确实解决了我眼前的问题。

在 emacs shell 窗口中,我运行了一个非常简单的 find

$ find . -type f -print >> ../files.log

然后我在 emacs 中打开它并输入 m-x list-matching-lines ^ ESC 230 . RETURN

它显示与正则表达式匹配的行,这里的正则表达式是行至少包含 230 个字符,其中 230 只是对可能有问题的行的粗略估计。这向我显示了两个太长的文件。

对于大约 20,000 个文件,正则表达式过滤几乎是即时的。

答案1

如果你恰好安装了 cygwin,我认为这应该可行:

find /cygdrive/c/Users/username/Dropbox -type f -print0 | xargs -0 -I {} bash -c 'if [[ $(echo -n "{}" | wc -c) -gt "269" ]]; then echo "{}"; fi'

抱歉,我不知道做同样事情的本土方法。

答案2

打开 Powershell 控制台: Get-ChildItem -r * |? {$_.GetType().Name -match "File" } |? {$_.fullname.length -ge 260} |%{$_.fullname}

感谢@rerun在Stack Overflow上发布此文。 https://stackoverflow.com/q/12697259/614863

答案3

补充这里给出的先前答案,这可能有助于用户检测到超过 MAX_PATH 最大路径长度(260 个字符)的路径(文件或文件夹)的存在。

尽管存在某些成功解决问题的技术,但 Windows不通知用户认为特定文件访问错误是由于 MAX_PATH 违规造成的。Windows 中也没有允许用户测试如果遇到不寻常的访问问题,则解决该问题。

但是,由于 Windows 文件资源管理器 (EXPLORER.EXE) 是无法处理超出限制的路径的 Windows 实用程序之一,因此对于粗心的用户来说,这可能是一个严重的问题。

这是一个简单的批处理文件,开发于Windows 7的。将文件夹拖放到上面,它将测试该文件夹及其子文件夹和文件是否违反 MAX_PATH,并在屏幕上输出结果,并且(但前提是任何违反 MAX_PATH 限制的情况)都将保存一个文本文件,其中包含超过最大 260 个字符的任何对象的完整路径。

如果文本文件被写入运行批处理文件的文件夹,这意味着发现 MAX_PATH 违规。

@echo off && title Find Paths exceeding MAX_PATH in "%~n1"
mode 80,32750

::             *** Find Paths with Length exceeding MAX_PATH ***


    ::  Directory : Drag-and-drop
        SET directory=%~1


    ::  To access an object violating MAX_PATH, use extended-length path
    ::  syntax (only supported by some Windows functions): "\\?\" prefix.

::  ========================================================================  ::
    ECHO Searching Path lengths in "%~n1" --
::  ========================================================================  ::

::  ========================================================================  ::
    :: Command Extensions
    SetLocal EnableDelayedExpansion
::  ========================================================================  ::

::  ========================================================================  ::
    echo. & echo. & ECHO Directory - & echo.
::  ========================================================================  ::

::  ** Not Recursive : Directory **

    :: For Specified Directory
    IF "%directory:~260%"=="" (
        echo "%directory%" & echo[is shorter than 260 characters & echo.
    ) ELSE (
        echo "%directory%" & echo[is longer than 260 characters & echo.
        echo "%directory%" >> "Path Exceeds 260 chrs.txt"
    )

::  ========================================================================  ::
    echo. & echo. & ECHO Sub-Directories - & echo.
::  ========================================================================  ::

::  ** Recursive (FOR Loop) : Sub-Directories **

    :: For each Folder in Directory Tree
    FOR /D /R "%directory%" %%a IN (*.*) DO (
      set folder=%%a
      set folder=!folder:~260!
      if "!folder!"=="" (
          echo "%%a" & echo[is shorter than MAX_PATH & echo.
      ) ELSE (
          echo "%%a" & echo[is longer than 260 characters & echo.
          echo "%%a" >> "Path Exceeds 260 chrs.txt"
      )
    )

    ::  Notes -
    ::  No output if no Sub-Directories.

::  ========================================================================  ::
    echo. & echo. & ECHO Files - & echo.
::  ========================================================================  ::

::  ** Recursive (FOR Loop) : Files **

    :: For each File in Directory Tree
    FOR /R "%directory%" %%a IN (*.*) DO (
      set file=%%a
      set file=!file:~260!
      if "!file!"=="" (
          echo "%%a" & echo[is shorter than MAX_PATH & echo.
      ) ELSE (
          echo "%%a" & echo[is longer than 260 characters & echo.
          echo "%%a" >> "Path Exceeds 260 chrs.txt"
      )
    )

    ::  Notes -
    ::  No output if no Files.

::  ========================================================================  ::
    echo. & echo. & cmd /k
::  ========================================================================  ::

答案4

find | xargs | bash——调用单个 bash 进程(编辑:哎呀——错过了xargs,抱歉,请忽略本段的其余部分:)只计算一行的长度,似乎有点“进程繁重”。有多少个文件,就有多少个 bash 调用,可能是很多...

find | awk每侧都会产生一个进程(即:只有 2 个进程)

尝试一下这个(应该会得到更快的结果[编辑:也许并非如此xargs]):

find . -type f | awk 'length > 259' > longfilename-list.txt

假设:可能取决于操作系统,YMMV

  • find将默认打印匹配项,因此不需要 -print0。
  • print $0(匹配的行)是中的默认操作awk,因此{print}比较后不需要。

相关内容