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}
比较后不需要。