xargs 无法处理行中的空格

xargs 无法处理行中的空格

所有目标文件已被删除。当然,当我尝试再次运行任何删除时,文件无法删除。抱歉耽误您的时间。


我在 cygwin 上使用 bash。

我的输出fdupes在一个文件中。我正在 grep 输出以排除我想保持完整的目录,并希望删除列出的其余文件。

我有一些带有空格的条目:

./NewVolume/keep/2009/conference/conference/conference 004.jpg

哪个跳闸xargs

$ cat real-dupes.txt |xargs rm {}
...
rm: cannot remove ‘2009/conference/conference/conference’: No such file or directory`

当我尝试-0切换时,看起来这些行被组合在一起:

$ cat real-dupes.txt |xargs -0 rm
xargs: argument line too long

其他问题都有答案,建议提问者使用find答案将论点输入xargs。这对我的场景没有帮助,因为我不相信我可以轻松地使用它find来识别我想要删除的重复项。另外,fdupes 作业运行了大约 12 个多小时,所以我真的很想使用这个数据集。

据我所知,fdupes无法将目录从自动删除中排除,因此我也无法开箱即用。

答案1

xargs -0不起作用,因为它需要一个以 null 结尾的字符串,但它找不到该字符串,因此读取所有输入并对其参数进行通配。

只需用 转换每个新行(我想每行都有一个文件名)\0,如下所示:

cat real-dupes.txt | tr '\n' '\0' | xargs -0 rm {}

答案2

默认情况下xargs在空白处分割。您也许可以使用非标准 -0 选项在字符处分割\000,但您的输入必须准备好符合预期。 (find ... -print0这是执行此操作的方法之一 - 假设您的版本find有该-print0选项。)

如果您的文件名称中不包含新行(即每行一个文件),您可以xargs像这样使用:

xargs -I{} rm {} <real-dupes.txt

的手册页xargs对标志有这样的描述-I

-I replace-strreplace-str将初始参数中 出现的 替换为从标准输入读取的名称。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。意味着-x-L 1

相关内容