需要一个Shell脚本,可以删除除了*.pdf以外的所有文件。

4

有人可以编写一个Shell脚本,删除文件夹中除了扩展名为pdf的文件以外的所有文件吗?

4个回答

14
这将包括所有子目录:
find . -type f ! -iname '*.pdf' -delete

这将仅在当前目录中生效:

find . -maxdepth 1 -type f ! -iname '*.pdf' -delete

2
只删除子目录中的非 PDF 文件。 - Robokop

6
$ ls -1 | grep -v '.pdf$' | xargs -I {} rm -i {}

或者,如果您有信心:

$ ls -1 | grep -v '.pdf$' | xargs -I {} rm {}

或者,更加稳妥的版本:

$ find . -maxdepth 1 -type f ! -iname '*.pdf' -delete

3
ls 命令的输出是用来展示给用户看的,而不是用来解析的。为了呈现给用户,ls 命令可能会替换字符或重新格式化文件名。 - Juliano
1
{}"{}"对于shell来说没有区别,它是传递给命令的单个参数。 - Juliano
1
这仍然是错误的,因为ls不是用来生成其他工具解析文件列表的。ls旨在生成用户可读的文件列表,并通过使其用户可读,ls可能会替换文件名中的字符,从而导致错误结果。touch $'A file\nwith a newline'将创建一个会破坏您命令的文件。 - Juliano
@Juliano,我同意并点赞你的回答 - 但是我必须说,我(幸运地)还没有看到过带有换行符的文件名。 - miku
@miku touch $'a\nfile\nwith\nnewlines\nin\nits\nname' - gniourf_gniourf

5
这应该可以解决问题:
shopt -s extglob
rm !(*.pdf)

如果您执行 shopt -s failglob,效果会更好。 - gniourf_gniourf

-1
ls | grep -v '.pdf$' | xargs rm

这将过滤掉所有不以PDF结尾的文件,并对它们执行RM命令


哦,看来确实如此。我之前没注意到,谢谢你指出来! - TyrantWave
这太糟糕了!不要使用它:解析ls命令的输出是非常糟糕的做法,因为它会在许多方面出现问题(文件名包含空格或以连字符开头)。 - gniourf_gniourf

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