如何删除其中包含某种文件类型的所有目录?

如何删除其中包含某种文件类型的所有目录?

我正在编写一个命令行脚本来“解压”包含.svg下载文件的文件夹。我已将所需的文件复制到特定目录,现在我需要删除所有.svg其中包含文件的目录因为它们充满了我不需要的其他格式和许可证。我该怎么做呢?

答案1

GNUly,这可能是:

LC_ALL=C find . -name '*.svg' -type f -printf '%h\0' |
  LC_ALL=C sort -zu |
  xargs -r0 echo rm -rf

在哪里find报告所有的目录名.svg 常规的文件,sort -zu删除重复项,然后xargs rm删除它们。

这并不是非常有效,因为即使在给定目录中找到文件.svg之后,它仍然会在给定目录的子目录中查找文件。.svg

请注意,如果当前目录包含.svg文件,将拒绝删除它(作为解决某些包含和扩展的shell 中的错误功能rm的安全措施)。rm -rf .rm -rf .*....*

.您可以通过替换上面的内容来解决这个问题"$PWD"

echo当您满意它会执行您想要的操作时,将其删除。

随着bosh,您可以使用其内置功能更有效地完成此操作find

has_svg() {
  find "$@" -maxdepth 1 -name '*.svg' -type f -call return 0 \;
  return 1
}

find . -type d -call 'has_svg "$1"' {} \; -prune -exec echo rm -rf {} +

答案2

使用 GNU find,我们使用 find 中的 find 首先从较低级别开始查看目录,然后检查该目录是否包含至少一个 .svg 文件。我们删除这样的目录。

$ find . -depth  ! -name . -type d  \
    -exec sh -c '
      N=$#
      for d do
        test "x$(find "$d/." -maxdepth 1 -type f -name "*.svg" -print -quit)" != "x" &&
          set -- "$@" "$d"
      done
      shift "$N"; rm -rf ${1+"$@"}
 ' find-sh {} +

相关内容