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

Ale*_*der 76 unix linux

我有一个长文本文件,其中包含我要删除的文件掩码列表

例:

/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
Run Code Online (Sandbox Code Playgroud)

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

找到这个命令,但是当我从列表中检查文件夹时,其中一些仍然有文件 xargs rm <1.txt手动rm调用从这些文件夹中删除文件,因此没有权限问题.

nos*_*nos 97

这不是很有效,但如果你需要glob模式(如在/ var/www/*中)将会有效

for f in $(cat 1.txt) ; do 
  rm "$f"
done
Run Code Online (Sandbox Code Playgroud)

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

xargs rm < 1.txt
Run Code Online (Sandbox Code Playgroud)

  • 如果路径包含空格,第一个解决方案(使用 CAT)会发生什么? (4认同)

aks*_*aks 51

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

xargs rm -r <1.txt
Run Code Online (Sandbox Code Playgroud)

-r选项导致递归到任何名为的目录1.txt.

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

xargs rm -rf <1.txt
Run Code Online (Sandbox Code Playgroud)

任何执行程序删除的工具的输入要小心.请一定在输入文件中指定的文件是真的被删除.看似简单的拼写错误要特别小心.例如,如果在文件及其后缀之间输入空格,则它将显示为两个单独的文件名:

file .txt
Run Code Online (Sandbox Code Playgroud)

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

这可能看起来不那么危险,但如果拼写错误是这样的:

myoldfiles *
Run Code Online (Sandbox Code Playgroud)

然后,而不是删除打头的所有文件myoldfiles,你最终会删除myoldfiles所有的非点的文件和目录在当前目录.可能不是你想要的.

  • 我认为这是一个危险的答案,如果它是一个*文件*列表,为什么要使用递归,加上强制删除使它成为一个枪炮 (2认同)

hek*_*mgl 18

用这个:

while IFS= read -r file ; do rm -- "$file" ; done < delete.list
Run Code Online (Sandbox Code Playgroud)

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

IFS=""
while read -r file ; do rm -- $file ; done < delete.list
Run Code Online (Sandbox Code Playgroud)

但请注意,文件名可以包含"有问题"的内容,我会使用不带引号的版本.想象一下文件中的这种模式

*
*/*
*/*/*
Run Code Online (Sandbox Code Playgroud)

这将从当前目录中删除相当多!我鼓励你以不再需要glob模式的方式准备删除列表,然后像我的第一个例子中那样使用引号.

  • 这是目前处理所有`/ My Dir With Spaces /``/ Spaces和globs/*.txt`,`--file-with-leading-dashes`的唯一答案,作为奖励它是POSIX并且可以工作GNU/Linux,macOS和BSD. (2认同)

Ray*_*Ray 14

您可以使用'\n'将新行字符定义为分隔符.

xargs -d '\n' rm < 1.txt
Run Code Online (Sandbox Code Playgroud)

注意-rf,因为如果1.txt包含带空格的路径,它可以删除你不想要的内容.这就是新线分隔符更安全的原因.

在BSD系统上,您可以使用-0选项将新行字符用作分隔符,如下所示:

xargs -0 rm < 1.txt
Run Code Online (Sandbox Code Playgroud)

  • `xargs -I_ rm _`也适用于OS X :)请参阅http://stackoverflow.com/a/39335402/266309 (2认同)
  • 您还可以首先运行 `xargs -d '\n' ls &lt; 1.txt` 或 `xargs -d '\n' stat &lt; 1.txt` 来验证将删除的内容并避免令人讨厌的意外 (2认同)

Mar*_*ago 13

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

在@tdavies指出原始版本没有进行shell扩展之后编辑了这个答案.

  • 如果它们是文件名中的一些空格,则无效 (3认同)
  • 球体不会膨胀,因为它们永远不会被外壳"看见". (2认同)

tgd*_*ies 12

你可以使用这个单行:

cat 1.txt | xargs echo rm | sh
Run Code Online (Sandbox Code Playgroud)

这是shell扩展但执行rm的次数最少.


小智 6

只是提供另一种方式,您也可以简单地使用以下命令

$ cat to_remove
/tmp/file1
/tmp/file2
/tmp/file3
$ rm $( cat to_remove )
Run Code Online (Sandbox Code Playgroud)


小智 5

cat 1.txt | xargs rm -f | bash运行该命令将仅对文件执行以下操作。

cat 1.txt | xargs rm -rf | bash运行该命令将执行以下递归行为。