我在这里看到了一些类似的问题,人们在xargs
处理文件名中的空格时遇到问题。令人惊讶的是,我没有遇到这个问题,而是遇到类似的问题。
我正在从大量文件中复制固定数量的文件(以非常混乱的方式随机选择)。该行代码如下所示:
find "/path/to/source/dir" -size +1k -type f -print0 | sort -R | ghead -z -n 10 | xargs -0 -I{} cp "{}" "/path/to/destination/dir"
可以将其想象为抽奖中的获胜者,因为每个文件都以一个人的名字命名。由于一些被画的人碰巧是德国人,他们也可能有非常德国的名字,比如马特乌斯·穆勒(Matthäus Müller)。 (不考虑其他特殊字符。)
每当这个代码怪物绘制一个名字中带有变音符号的人(或更准确地说,在文件名中)时,复制过程就会停止:
cp: /path/to/source/dir/Matthäus Müller.jpg: No such file or directory
我可以保证这个问题不是因为空格字符,因为所有文件名都有空格,并且它只会在带有变音符号的文件名上中断。
有什么办法可以解决这个问题,还是我必须以不同的方式编写整个机制(如果是这样,该怎么做)?
注 1:我无法将这些文件名更改为“Matthaeus Mueller.jpg”或类似的名称来规避此问题;他们就是这样。
注 2:如果这很重要,则该脚本在 macOS 上运行。
答案1
您缺少-z
中的 NULL 终止记录sort
。解决这个问题,问题就消失了(无论如何对我来说)。无论你能否成功地复制带有变音符号的名字,这都是很可能的——我不认为这实际上是问题所在。
例子
mkdir /tmp/610423/{src,dst}
cd /tmp/610423
touch 'src/Matthäus Müller.jpg' 'src/Peter Gurney' 'src/Tom Pearce'
# Error here
find /tmp/610423/src -type f -print0 | sort -R | head -zn10 | xargs -0 -I{} cp {} dst/
cp: cannot stat ''$'\n': No such file or directory
# No error here
find /tmp/610423/src -type f -print0 | sort -zR | head -zn10 | xargs -0 -I{} cp {} dst/
我已经在 Debian Linux 发行版上进行了测试。我假设你的是我们在 Debian 上作为标准的ghead
GNU程序。head
你的sort
有吗-z
?如果不是,您可能需要重新考虑-print0
其余实用程序的执行情况,尽管这很好。