当前位置:  开发笔记 > 编程语言 > 正文

删除除一个以外的所有目录

如何解决《删除除一个以外的所有目录》经验,为你挑选了1个好方法。

所以使用shell,并有一个目录:

./parent
./parent/one
./parent/two
./parent/three
./parent/four

我想rm -rf parent/*在一个命令中执行某些操作,但保留一个目录,例如"四个",因此最终结果将是

./parent
./parent/four

Etan Reisner.. 20

有了bash你可以用这样做extglob的选项shopt.

shopt -s extglob
cd parent
rm -rf !(four)

使用posix shell我认为你可以使用循环来做到这一点

for dir in ./parent/*; do
    [ "$dir" = "four" ] && continue
    rm -rf "$dir"
done

或使用数组rm只运行一次(但它需要数组或使用"$@")

arr=()
for dir in ./parent/*; do
    [ "$dir" = "four" ] && continue
    arr+=("$dir")
done
rm -rf "${arr[@]}"

要么

for dir in ./parent/*; do
    [ "$dir" = "four" ] && continue
    set -- "$@" "$dir"
done
rm -rf "$@"

或者你可以使用 find

find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} \;

或(与find拥有-exec +,以节省一些rm处决)

find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} +

哦,或者假设目录列表不是太大而且笨重,我想你总是可以使用

rm -rf parent/**

然后删除parent/four从命令行的输入和命中enter其中*的readline的默认绑定glob-expand-word.



1> Etan Reisner..:

有了bash你可以用这样做extglob的选项shopt.

shopt -s extglob
cd parent
rm -rf !(four)

使用posix shell我认为你可以使用循环来做到这一点

for dir in ./parent/*; do
    [ "$dir" = "four" ] && continue
    rm -rf "$dir"
done

或使用数组rm只运行一次(但它需要数组或使用"$@")

arr=()
for dir in ./parent/*; do
    [ "$dir" = "four" ] && continue
    arr+=("$dir")
done
rm -rf "${arr[@]}"

要么

for dir in ./parent/*; do
    [ "$dir" = "four" ] && continue
    set -- "$@" "$dir"
done
rm -rf "$@"

或者你可以使用 find

find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} \;

或(与find拥有-exec +,以节省一些rm处决)

find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} +

哦,或者假设目录列表不是太大而且笨重,我想你总是可以使用

rm -rf parent/**

然后删除parent/four从命令行的输入和命中enter其中*的readline的默认绑定glob-expand-word.


很好的答案.我通常只是`mv`目录并删除其他所有内容.;)+1
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有