txt文件中的xargs和换行符 - “xargs -d'/ n'”失败

时间:2014-01-20 20:40:47

标签: newline xargs

我有一个列表,我需要在txt文件中删除大约10k项目。

我从这里开始: Unix: How to delete files listed in a file

但遇到了

rm: 721_0199_01.mov\r: No such file or directory

看起来我需要忽略/不通过'/ r'

所以,我去这里: xargs and find, rm complaining about \n (newline) in filename

它看起来像是:

xargs -d '/r' rm < my-big-list.txt 

但它抱怨道:

xargs: illegal option -- d
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
         [-L number] [-n number [-x]] [-P maxprocs] [-s size]
         [utility [argument ...]]

我在xargs的任何手册页中都找不到-d,所以不知道从哪里开始....

我离开了,是不是错过了读书?

谢谢!

嗯 - 再次,谢谢大家,我确实摆脱了/ r,但我在这些文件名中有大量的空白,这导致我:

How can I make xargs handle filenames that contain spaces?

-0更改xargs以期望NUL(``\ 0'')字符作为分隔符,          而不是空格和换行符。预计将用于此          与find(1)中的-print0函数一致。

那就是:

Linux: Redirecting output of a command to "find"

但这并没有真正帮助......

rad vans Skype Testccc995141.vid

rad vans Skype Testccc995142.vid

rad vans Skype Testccc995143.aiff

rad vans Skype Testccc995144.aiff

rad vans Skype Testccc995145.qtc

rad vans Skype Testccc998bf.mov

rad vans Skype Testccc998bf1.vid

rad vans Skype Testccc998bf2.vid

rad vans Skype Testccc998bf3.aiff

rad vans Skype Testccc998bf4.aiff

rad vans Skype Testccc998bf5.qtc

是我正在尝试删除的一个很好的例子 - 我怀疑这个列表大约是该目录内容的60%......

使用Find有什么技巧吗?

谢谢!

4 个答案:

答案 0 :(得分:0)

这只是猜测,但看起来您的原始文件是在Windows操作系统下制作的。

在Windows下,要表达新行,您可以在Uni *下使用 \ r \ n ,但通常只有 \ n 。 这将解释为什么xargs不会删除此字符。

我建议您通过该程序运行您的文件:dos2unix它应该可以解决您的问题。

答案 1 :(得分:0)

你可以尝试一些不同的方式:

remove.sh

#!/bin/bash
while read line
do 
    rm $line
done

remove.sh < my-big-list.txt

xargs方法可以达到bash限制。 echo $ ARG_MAX应该大于你的文件。您可以通过导出ARG_MAX = new_value

来增加它

答案 2 :(得分:0)

您可以使用-d '\n'选项将新行字符定义为GNU xargs的分隔符。

xargs -d '\n' rm < my-big-list.txt

在BSD系统上,您可以使用-0选项将新行字符用作分隔符。

xargs -0 rm < my-big-list.txt

答案 3 :(得分:0)

如果您的xargs不支持选项d(用于分隔符),例如在macOS上,那么您有时可以使用选项0

< my-big-list.txt tr "\n" "\0" | xargs -0 rm

此解决方案比while ... do ... done

更快