Linux Unix:如何删除文件中列出的文件
我有一个长文本文件,其中包含要删除的文件掩码列表 例如:Linux Unix:如何删除文件中列出的文件,linux,unix,Linux,Unix,我有一个长文本文件,其中包含要删除的文件掩码列表 例如: /tmp/aaa.jpg /var/www1/* /var/www/qwerty.php 我需要删除它们。尝试了rm`cat 1.txt',它说列表太长 找到此命令,但当我检查列表中的文件夹时,其中一些文件夹仍有文件 xargsrmxargs-I{}sh-c'rm{}'
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
我需要删除它们。尝试了rm`cat 1.txt',它说列表太长
找到此命令,但当我检查列表中的文件夹时,其中一些文件夹仍有文件
xargsrmxargs-I{}sh-c'rm{}'<1.txt
应该做你想做的事。使用此命令时要小心,因为该文件中的一个错误条目可能会导致很多麻烦
这个答案是在@tdavies指出原始版本没有进行shell扩展之后编辑的。这不是很有效,但是如果您需要glob模式(如/var/www/*)
如果没有任何模式,并且确保文件中的路径不包含空格或其他奇怪的内容,则可以使用如下XARG:
xargs rm < 1.txt
xargs rm<1.txt
您可以使用这一行:
cat 1.txt | xargs echo rm | sh
它执行shell扩展,但执行rm
的次数最少。在这里,您可以使用deletelist.txt中的文件夹集,同时也可以避免某些模式
foreach f (cat deletelist.txt)
rm -rf ls | egrep -v "needthisfile|*.cpp|*.h"
end
假设文件列表位于文件1.txt
中,则执行以下操作:
xargs rm -r <1.txt
对任何进行编程删除的工具的输入都要谨慎。确保输入文件中命名的文件确实要删除。对于看似简单的打字错误要特别小心。例如,如果在文件及其后缀之间输入空格,则它将显示为两个单独的文件名:
file .txt
实际上是两个独立的文件:file
和.txt
这似乎不太危险,但如果打字错误是这样的:
myoldfiles *
xargs -0 rm < 1.txt
然后,不再删除以myoldfiles
开头的所有文件,而是删除当前目录中的myoldfiles
和all非点文件和目录。可能不是你想要的。使用以下方法:
while IFS= read -r file ; do rm -- "$file" ; done < delete.list
但请注意,文件名可能包含“有问题”的内容,我将使用不带引号的版本。想象一下文件中的这种模式
*
*/*
*/*/*
这将从当前目录中删除很多内容!我鼓励您以一种不再需要glob模式的方式准备删除列表,然后像我的第一个示例中那样使用quoting。在这种特殊情况下,由于其他答案中引用的危险,我会
在例如Vim和中编辑:%s/\s/\\\0/g
,用反斜杠转义所有空格字符
然后,:%s/^/rm-rf/
,在命令前面加上前缀。使用-r
您不必担心在其中包含的文件之后列出目录,而使用-f
它不会因为缺少文件或重复条目而抱怨
运行所有命令:$source 1.txt
下面是另一个循环示例。该语句还包含一个“if语句”,作为检查条目是否为“文件”(例如“目录”)的示例:
可以使用“\n”将新行字符定义为分隔符
xargs -d '\n' rm < 1.txt
xargs-d'\n'rm<1.txt
小心使用-rf,因为如果1.txt包含带空格的路径,它可能会删除您不想删除的内容。这就是为什么新行分隔符更安全的原因
在BSD系统上,可以使用-0选项将新行字符用作分隔符,如下所示:
myoldfiles *
xargs -0 rm < 1.txt
xargs-0 rm<1.txt
这将允许文件名包含空格(可复制的示例)
cat 1.txt | xargs rm-f | bash
运行该命令将仅对文件执行以下操作
cat 1.txt | xargs rm-rf | bash
运行该命令将执行以下递归行为。为了提供另一种方法,您也可以简单地使用以下命令
$ cat to_remove
/tmp/file1
/tmp/file2
/tmp/file3
$ rm $( cat to_remove )
如果有人喜欢sed
并在不使用通配符扩展的情况下删除:
sed -e "s/^\(.*\)$/rm -f -- \'\1\'/" deletelist.txt | /bin/sh
提醒:在文件中使用绝对路径名或确保您位于正确的目录中
对于完整性,与awk
相同:
awk '{printf "rm -f -- '\''%s'\''\n",$1}' deletelist.txt | /bin/sh
如果删除单引号,则通配符扩展将起作用,但如果文件名包含空格,则这是危险的。这需要在通配符周围添加引号。谢谢,但不需要删除文件夹,只有文件全局不会被扩展,因为它们永远不会被shell“看到”。@t视频哇-你说得对。这个命令(虽然有点难看)会起作用:
xargs-I{}sh-c'rm{}<1.txt如果文件名有单引号edit则不起作用:现在它还支持spacesAs,只要任何扩展不太长?True,glob可能会生成一个过长的参数列表——您可以将-n
参数添加到xargs
以减少传递给每个rm的参数数量,但这仍然无法保护您免受单个glob超过限制的影响。使用-rf时,“myoldfiles/”或“/tmp”更糟糕。注意“/”旁边的空格字符。我认为这是一个危险的答案,如果它是一个文件列表,为什么要使用recurse,再加上强制删除,这就成了OS X上的一个footgunOn。这让我明白了xargs:unligal option--d
很好的观点。似乎在OSX上除了-0
之外没有其他选择。xargs-I_urm\ucode>也可以在OSX中工作:)请看,您也可以先运行xargs-d'\n'ls<1.txt
或xargs-d'\n'stat<1.txt
来验证将删除的内容并避免讨厌的操作surprises@Ray如果文件不存在,使用stat或find会出现错误,你没有权限等等,我发现这有助于验证路径是否正确等等,即使是六年后:你介意接受其中一个答案吗?这将把问题标记为已解决,并帮助其他用户。这是目前处理所有带空格的/My Dir/
/Spaces and globs/*.txt
,--带前导破折号的文件的唯一答案,另外它是POSIX,可以在GNU/Linux、macOS和BSD上工作。这应该是
$ cat to_remove
/tmp/file1
/tmp/file2
/tmp/file3
$ rm $( cat to_remove )
sed -e "s/^\(.*\)$/rm -f -- \'\1\'/" deletelist.txt | /bin/sh
awk '{printf "rm -f -- '\''%s'\''\n",$1}' deletelist.txt | /bin/sh