find 和 rsync 都因名称奇怪的文件而阻塞

find 和 rsync 都因名称奇怪的文件而阻塞

这对我来说不是一个重要的问题,但我认为 rsync 和 find 相当强大,所以当 rsync 在文件上阻塞时我感到很惊讶,然后 find 也是如此。ls -l显示该文件有 6093 字节(并且它是该目录中唯一的文件,因此我在 cd'ing 到该目录后执行此操作):

# find . -size 6093c
./????????????????????????:??????????????????????????????????????????
find: './\353\266\204\353\245\230:\353\257\270\352\265\255\354\235\230_\355\205\224\353\240\210\353\271\204\354\240\204_\352\262\214\354\236\204_\354\207\274': No such file or directory

知道这意味着什么吗?奇怪的是,

# find . -size 6093c | xargs less

工作正常。这是 ls 看到的:

# ls -lat | fgrep "6093 "
ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 หมวà¸à¸«à¸¡à¸¹à¹:à¹à¸à¸¡à¹à¸à¸§à¹à¸­à¹à¸¡à¸£à¸´à¸à¸²

如果我将结果传输到 less,它只会稍微好一点:

# ls -lat | fgrep "6093 " | less

ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 <E0><B8><AB><E0><B8><A1><E0><B8><A7><E0><B8><94><E0><B8><AB><E0><B8><A1><E0><B8><B9><E0><B9><88>:<E0><B9><80>
<E0><B8><81><E0><B8><A1><E0><B9><82><E0><B8><8A><E0><B8><A7><E0><B9><8C><E0><B8><AD><E0><B9><80><E0><B8><A1><E0><B8><A3><E0><B8><B4><E0><B8><81><E0><B8><B2>

同一目录有一个文件,即使 ls 也无法处理,但我可以列出它,因为它有点显示为最旧的条目:

# ls -lat | tail -1 | less
ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-?????????? ? ?      ?           ?            ? <EB><B6><84><EB><A5><98>:<EB>
<AF><B8><EA><B5><AD><EC><9D><98>_<ED><85><94><EB><A0><88><EB><B9><84><EC><A0>
<84>_<EA><B2><8C><EC><9E><84>_<EC><87><BC>

不是特别重要,但有点好奇。

编辑:由于这个问题似乎必须很快引起很多关注,我做了一些“研究”(可能完全准确,也可能不完全准确)。我不太能够复制这个问题,但是:

答案1

这个奇怪的命名文件可能是为了转移注意力。您的工具正在执行一些技巧,让您认为某些东西已损坏。

文件名采用 UTF-8 格式,因此您应该export LANG=en_US.UTF-8允许命令毫无摩擦地使用文件名。运行locale不带参数的命令来验证当前环境变量。

或者,如果您坚持使用“C”语言环境,请使用ls -bls 打印转义序列而不是问号。然后你可以$'\353\266\204\…'在 bash 中用作参数。

find命令胆怯地拒绝将非文本字符写入 tty。换句话说,find行为find | cat不同,后者写下的名称不带引号,所以这就是为什么find | xargs确实有效。一种更可靠的编写方法是find -print0 | xargs -0防止 xargs 解释可能的空白字符。

这并不能解释“没有这样的文件或目录”——无论如何,你的文件系统可能确实包含错误——但它应该允许你更准确地向命令行陈述你的意图。

起初我不认为这是相关的,但我习惯在奇怪的文件名前加上前缀,以./防止命令解释它们。侧边栏显示了相关问题“rsync:文件名中的冒号”这可能是 rsync 错误的根本原因。

相关内容