使用Shell命令/脚本删除文本文件中列出的文件名的文件

17

我有一个以 .txt 格式保存的文件列表(比如说叫做 list.txt),我想要删除其中列出的文件。我之前从来没有写过脚本,能否提供一个 shell 脚本 / 命令让我使用呢?我使用的是 bash shell。

7个回答

50
while read -r filename; do
  rm "$filename"
done <list.txt

速度慢。

rm $(<list.txt)

如果参数过多,将会失败。

我认为它应该可以工作:

xargs -a list.txt -d'\n' rm

1
虽然 rm $(<list.txt) 更快,但是+1提到了它在参数数量上的限制。 - Tim Pote
$ for i in *; do echo $i; done > ~/a $ rm frd.xml $ while read f; do rm $f; done < ~/a这段代码是由同事提供的。它看起来与您的答案非常相似。谢谢! - Romonov
这会同时删除子目录中的文件吗? - Bhargav
1
xargs:非法选项--a - Cœur
xargs选项对我很有帮助...当然了...我必须每行保留一个文件名,之间没有空格,开头和结尾都没有引号...一个完全经过消毒的纯文本字符串就可以了...而且我需要删除超过900,000个文件。 - Apricot
$(<list.txt)$(cat list.txt)有什么区别?哪一个更好? - zozo

12

尝试使用这个命令:

rm -f $(<file)

你的问题说你有一个名为list.txt的文件名列表。显然,你没有。 :-) - Adam Liss
要么你需要给出lists.txt的完整路径。 - Tim Pote
返回已翻译的文本:或者使用“gio trash $(<list.txt)”将它们发送到垃圾桶 :) - CervEd

5
如果文件名中有空格,其他答案都不会起作用;它们将把每个单词视为一个单独的文件名。假设文件列表在list.txt中,则以下方法始终有效:
while read name; do
  rm "$name"
done < list.txt

好观点。问题是原帖作者没有一个名为 list.txt 的文件,所以由于某种原因这给他造成了问题;-) - yamen
好的。请看我对Tim Pote答案的评论。 - Adam Liss

3

为了在macOS上快速执行,其中xargs自定义分隔符d不可用:

<list.txt tr "\n" "\0" | xargs -0 rm

1
以下代码应该可以正常工作,并且在循环过程中还可以让你有余地去做其他事情。
编辑:不要这样做,请参见此处:http://porkmail.org/era/unix/award.html for file in $(cat list.txt); do rm $file; done

它给了我一个错误。rm: 无法删除'cat': 没有那个文件或目录。rm: 无法删除'list.txt': 没有那个文件或目录。 - Romonov
1
稍微改了一下格式。你之前用过反引号吗?注意@TimPote的回答可能更好? - yamen
感谢您的回答。我的 Bash 环境似乎有些问题,但目前无人能够检查我办公室的工作站,我也不能在这里发布该问题。因此,我只能等到下个工作日星期一,直到有人来查看它。 - Romonov
@AdamLiss:哇,我不知道呢。谢谢你的启发!注意到你第一个链接更有趣,特别是它与我发布的确切示例相关,这里重复一下链接:http://partmaps.org/era/unix/award.html - yamen
@yamen:感谢转发。我无法决定哪个链接更有帮助。通常情况下,您可以使用$(<foo)替换$(cat foo)以避免产生额外的进程(如果您是我,还可以避免打错字)。 - Adam Liss

1

我今天刚好在寻找这个问题的解决方案,最终使用了一些答案和一些实用函数的修改版本。

// This is in my .bash_profile

# Find
ffe () { /usr/bin/find . -name '*'"$@" ; } # ffe: Find file whose name ends with a given string

# Delete Gradle Logs
function delete_gradle_logs() {
   (cd ~/.gradle; ffe .out.log | xargs -I@ rm@)
}


0
在Linux上,您可以尝试:
printf "%s\n" $(<list.txt) | xargs -I@ rm @

在我的情况下,我的 .txt 文件包含了一系列的 *.ext 类型的项目,并且运行良好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接