因此,使用外壳程序并拥有一个目录:
./parent
./parent/one
./parent/two
./parent/three
./parent/four
我想rm -rf parent/*
在一个命令中执行类似的操作,但是保留一个目录,例如“四个”,因此最终结果将是
./parent
./parent/four
使用,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
。
极好的答案。我通常只是
mv
目录,然后删除其他所有内容。;)+1@erip Heh,是的,在许多情况下,这无疑是一条容易得多的路线。虽然
extglob
几乎一样简单。小心!这
find
是书面也将匹配./parent
!完美的!与find一起使用。/parent-mindepth 1-名称4 -prune -o -exec rm -rf {} +
这只是从OP查找示例的正确形式
find ./ -mindepth 1 -name four -prune -o -exec rm -rf {} \;