我正在编写一个命令行脚本来“解压”包含.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 {} +