我有一个包含要删除的文件名通配符列表的长文本文件。
例如:
/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
如果您没有任何模式,并且确定文件中的路径不包含空格或其他奇怪的字符,则可以使用xargs进行操作,如下所示:
xargs rm < 1.txt
filename='123.txt'; while read line ; rm -r "$line"; done < $filename
。请注意在$line周围的引号。这是shell脚本中的一个要点。 - undefined假设文件列表在文件1.txt
中,则执行以下操作:
xargs rm -r <1.txt
-r
选项会使得进入1.txt
中所有命名的目录进行递归操作。
如果有任何只读文件,使用-f
选项来强制删除:
xargs rm -rf <1.txt
使用任何进行编程删除的工具时,请小心输入。确保在输入文件中命名的文件确实要被删除。特别注意看似简单的打字错误。例如,如果您在文件名和后缀之间输入一个空格,则它将显示为两个不同的文件名:
file .txt
实际上是两个不同的文件:file
和 .txt
。
这可能看起来并不危险,但如果打错了字如下所示:
myoldfiles *
那么,如果你删除所有以myoldfiles
开头的文件,最终你将会删除当前目录下myoldfiles
文件和所有非点文件和目录。这可能不是你想要的结果。
使用这个:
while IFS= read -r file ; do rm -- "$file" ; done < delete.list
如果你需要全局扩展,可以省略引用$file
:
IFS=""
while read -r file ; do rm -- $file ; done < delete.list
但请注意文件名可能包含“有问题”的内容,建议使用未加引号的版本。想象一下文件中出现了这种模式
*
*/*
*/*/*
这将从当前目录中删除相当多的内容!我建议您以一种不再需要使用glob模式的方式准备删除列表,然后像我的第一个示例那样使用引号。
/My Dir With Spaces/
/Spaces and globs/*.txt
, --file-with-leading-dashes
的答案,额外加分点是它遵循 POSIX,适用于GNU/Linux、macOS和BSD。 - that other guyxargs -d '\n' rm < 1.txt
当使用 -rf 命令时要小心,因为如果 1.txt 文件包含带空格的路径,它可能会删除你不想删除的内容。这就是为什么换行符作为分隔符更安全一些。
在 BSD 系统上,你可以使用 -0 选项来使用新行字符作为分隔符,像这样:
xargs -0 rm < 1.txt
xargs -I_ rm _
在 OS X 中也可以使用 :) 参见 https://dev59.com/mm3Xa4cB1Zd3GeqPbB67#39335402 - waldyriousxargs -d '\n' ls < 1.txt
或者 xargs -d '\n' stat < 1.txt
来验证将要被删除的内容,以避免不必要的意外。 - CervEdxargs -d '\n' echo rm < 1.txt
- Rayxargs -I{} sh -c 'rm "{}"' < 1.txt
可以实现您想要的功能。但要小心使用此命令,因为文件中一个错误的条目可能会引起很多麻烦。
在 @tdavies 指出原始文本没有执行 shell 扩展后,此答案经过了编辑。
xargs -I{} sh -c 'rm {}' < 1.txt
- Mark Drago你可以使用这个一行代码:
cat 1.txt | xargs echo rm | sh
该命令会进行Shell扩展,但最少执行rm
的次数。
xargs
的-n <n>
参数来减少传递给每个rm的参数数量,但这仍然不能保护你免受超过限制的单个glob的影响。 - tgdavies为了提供另一种方法,您也可以简单地使用以下命令
$ cat to_remove
/tmp/file1
/tmp/file2
/tmp/file3
$ rm $( cat to_remove )
rm -r
命令也是如此。以这种方式删除了约 5TB 的数据。也可以与其他命令一起使用,例如 ls
或 du
。 - Ólavurcat 1.txt | xargs rm -f | bash
运行此命令将只对文件进行操作。
cat 1.txt | xargs rm -rf | bash
运行此命令将会进行递归操作。
鉴于其他答案中提到的危险性,在这种特殊情况下,我建议:
使用例如Vim进行编辑,运行命令:%s/\s/\\\0/g
,将所有空格字符用反斜杠转义。
然后运行命令:%s/^/rm -rf /
,在命令前添加删除命令。使用-r
选项可以避免出现文件夹列表中包含其中的文件,而使用-f
选项可以避免因缺少文件或重复条目而发出投诉。
运行所有命令:$ source 1.txt
for f in $(cat 1.txt); do if [ -f $f ]; then rm $f; fi; done