我有一个列表,我需要在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有什么技巧吗?
谢谢!
答案 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