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,它可以删除你不想要的东西。 这就是为什么新的分界符更安全一些。
在这个特殊情况下,由于其他答案中引用的危险,我会这样做
-
在例如Vim和
:%s/\s/\\\0/g
,用反斜杠转义所有空格字符。 -
然后
:%s/^/rm -rf /
,预先执行命令。 使用-r
你不必担心在其中包含的文件之后列出目录,使用-f
它不会因为丢失文件或重复条目而投诉。 -
运行所有命令:
$ 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