Warm tip: This article is reproduced from serverfault.com, please click

shell-删除除一个目录外的所有目录

(shell - delete all directories except one)

发布于 2015-12-03 02:55:11

因此,使用外壳程序并拥有一个目录:

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

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

./parent
./parent/four
Questioner
André Alçada Padez
Viewed
0
Etan Reisner 2015-12-03 11:26:09

使用,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/*<ctrl-x>*

然后parent/four从命令行中删除该条目,然后点击enter,这<ctrl-x>*是readline的默认绑定glob-expand-word