【发布时间】:2011-01-15 22:46:31
【问题描述】:
任何人都可以编写一个 shell 脚本来删除文件夹中的所有文件,但扩展名为 pdf 的文件除外?
【问题讨论】:
标签: bash shell sh delete-file
任何人都可以编写一个 shell 脚本来删除文件夹中的所有文件,但扩展名为 pdf 的文件除外?
【问题讨论】:
标签: bash shell sh delete-file
这将包括所有子目录:
find . -type f ! -iname '*.pdf' -delete
这只会在当前目录中起作用:
find . -maxdepth 1 -type f ! -iname '*.pdf' -delete
【讨论】:
$ 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
【讨论】:
{} 或 "{}" 对 shell 没有影响,它是传递给命令的单个参数
ls 并不是要生成要被其他工具解析的文件列表。 ls 旨在生成用户可读的文件列表,通过使其用户可读,ls 可能会替换文件名中的字符,这可能会导致错误的结果。 touch $'A file\nwith a newline' 将创建一个会破坏您的命令的文件。
touch $'a\nfile\nwith\nnewlines\nin\nits\nname'.
这应该可以解决问题:
shopt -s extglob
rm !(*.pdf)
【讨论】:
shopt -s failglob会更好。
ls | grep -v '.pdf$' | xargs rm
这将过滤所有不以 PDF 结尾的文件,并对它们执行 RM
【讨论】:
ls 的输出是非常糟糕的做法,它会以多种方式中断(文件名带有空格或以连字符开头)。