删除包含与模式匹配的文件的所有文件夹

删除包含与模式匹配的文件的所有文件夹

我正在尝试删除当前工作目录中包含 rar 文件的所有子目录。

我的第一次尝试:find -name *.rar -exec rm -r {}/.. ';'失败,因为那不是有效的目录。我尝试使用dirname {}更明智的命令,但决定在几乎删除我无意的内容后询问。

我在 Windows 7 上使用 Cygwin。

答案1

使用 zsh:

rm -rf **/*.rar(:h)

后缀:h适用于历史扩展修改器 h(“head”) 删除每个匹配的基本名称,仅保留目录部分。

请务必检查这些目录是否确实是您要删除的目录!例如,首先将它们移动到临时目录:

mkdir DELETE
mv **/*.rar(:h) DELETE/
# check that you really want to delete everything in DELETE
rm -r DELETE

答案2

您可以使用findbash -c来执行更高级的操作-exec。结合使用临时文件和 cat 的问题xargs是,如果文件包含空格、换行符或制表符,则会中断。以下应该有效:

find . -type f -name '*.rar' -exec bash -c 'rm -rf "${@%/*}"' -- {} +

+将for find 与“$@”一起使用将rm像使用 一样执行一次xargs

答案3

你可以用一对语句来做到这一点。

首先,使用以下命令获取要删除的目录列表

find -name *.rar -exec dirname {} ';' > toremove

接下来,cat toremove确保它包含您想要的文件夹。然后,将其传递给rm -rf使用

sed 's/^/"/g' toremove | sed 's/$/"/g' | xargs rm -r

最后的,rm toremove

答案4

你可以尝试这样的事情:

for dir in */; do             # iterate all subdirectories
    touch $dir"dummy.rar"     # create a "rar"-file...
    for file in $dir*.rar; do # ...so this won't break on zero such
        rm $file              # remove the dummy, and all archives
    done
done

相关内容