使用 xarg 时处理文件名中的变音符号

使用 xarg 时处理文件名中的变音符号

我在这里看到了一些类似的问题,人们在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 上作为标准的gheadGNU程序。head你的sort有吗-z?如果不是,您可能需要重新考虑-print0其余实用程序的执行情况,尽管这很好。

相关内容