我正在尝试删除当前工作目录中包含 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