Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Unix:如何删除文件中列出的文件_Linux_Unix - Fatal编程技术网

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',它说列表太长

找到此命令,但当我检查列表中的文件夹时,其中一些文件夹仍有文件
xargsrm
xargs-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