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

时间:2015-12-03 02:55:11

标签: shell posix

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

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

我希望在一个命令中执行类似rm -rf parent/*的操作,但保留一个目录,例如“4”,因此最终结果将是

./parent
./parent/four

3 个答案:

答案 0 :(得分:16)

使用bash,您可以使用extglob的{​​{1}}选项执行此操作。

shopt

使用posix shell我认为你可以使用循环来执行此操作

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

或使用数组只运行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 +次{/ p>}

rm

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

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

然后从命令行中删除rm -rf parent/*<ctrl-x>* 条目并点击输入,其中parent/four是readline对<ctrl-x>*的默认绑定。

答案 1 :(得分:2)

我认为最简单实用的方法是将异常移动到父文件夹,删除所有内容将其移回

mv exceptionFolder ..
rm -rf *
mv ../exceptionFolder .

答案 2 :(得分:1)

您可以使用find

 find . -maxdepth 1 ! -name foldder_name -type d -not -path '.' -exec rm -rf {} +

find-它的命令搜索文件/目录

-maxdepth 1-找不到foldder_name子类别

. ! -name foldder_name-这意味着在当前目录.中进行搜索,不要以其真实姓名! -name foldder_name来查找该文件

-type d-仅查找目录

-not -path '.'-找不到隐藏的文件夹

-exec rm -rf {} +-删除所有找到的数据