Unix:如何删除文件中列出的文件

我有一个长文本文件,我想要删除的文件蒙版列表

例:

/tmp/aaa.jpg /var/www1/* /var/www/qwerty.php 

我需要删除它们。 试过rm`cat 1.txt`,它说列表太长了。

发现这个命令,但是当我从列表中检查文件夹时,其中一些仍然有文件xargs rm <1.txt手动rm调用从这样的文件夹中删除文件,所以没有权限的问题。

这不是非常有效,但是如果你需要全局模式(如/ var / www / *)

 for f in $(cat 1.txt) ; do rm "$f" done 

如果你没有任何模式,并确定文件中的path不包含空格或其他奇怪的东西,你可以像这样使用xargs:

 xargs rm < 1.txt 

假设文件列表在文件1.txt ,那么执行:

 xargs rm -r <1.txt 

-r选项导致recursion到在1.txt命名的任何目录。

如果有任何文件是只读的,请使用-f选项强制删除:

 xargs rm -rf <1.txt 

谨慎input任何编程删除的工具。 确保input文件中指定的文件真的被删除。 要特别小心看似简单的错别字。 例如,如果在文件及其后缀之间input空格,它将显示为两个单独的文件名:

 file .txt 

实际上是两个单独的文件: file.txt

这似乎不是那么危险,但如果错字是这样的:

 myoldfiles * 

然后,而不是删除所有以myoldfiles开头的文件,最终删除当前目录中的myoldfiles文件和所有非点文件和目录。 可能不是你想要的。

xargs -I{} sh -c 'rm {}' < 1.txt应该做你想做的。 请小心使用此命令,因为该文件中的一个不正确的条目可能会导致很多麻烦。

这个答案在@tdavies指出原来没有做shell扩展之后被编辑了。

你可以使用这一行:

 cat 1.txt | xargs echo rm | sh 

哪个shell扩展,但执行rm最less次数。

用这个:

 while read file ; do rm "$file" ; done < delete.list 

如果你需要glob扩展,你可以省略引用$file

 while read file ; do rm $file ; done < delete.list 

但要注意的是,文件名可以包含“有问题”的内容,我会使用无引号的版本。 想象一下在该文件中的模式

 -rf * 

这将删除当前目录中的所有recursion操作! 我鼓励你以不需要全局模式的方式来准备删除列表,然后像在第一个示例中那样使用引用

你应该使用'\ n'来定义新的行字符作为分隔符。

 xargs -d '\n' rm < 1.txt 

小心-rf,因为如果1.txt包含带空格的path,它可以删除你不想要的东西。 这就是为什么新的分界符更安全一些。

在这个特殊情况下,由于其他答案中引用的危险,我会这样做

  1. 在例如Vim和:%s/\s/\\\0/g ,用反斜杠转义所有空格字符。

  2. 然后:%s/^/rm -rf / ,预先执行命令。 使用-r你不必担心在其中包含的文件之后列出目录,使用-f它不会因为丢失文件或重复条目而投诉。

  3. 运行所有命令: $ source 1.txt

这是另一个循环的例子。 这一个也包含一个“if语句”作为检查条目是否为“文件”(例如“目录”)的示例:

 for f in $(cat 1.txt); do if [ -f $f ]; then rm $f; fi; done 

在这里,您可以使用deletelist.txt中的一组文件夹,同时避免使用某些模式

 foreach f (cat deletelist.txt) rm -rf ls | egrep -v "needthisfile|*.cpp|*.h" end