所以使用shell,并有一个目录:
./parent
./parent/one
./parent/two
./parent/three
./parent/four
我希望在一个命令中执行类似rm -rf parent/*
的操作,但保留一个目录,例如“4”,因此最终结果将是
./parent
./parent/four
答案 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 {} +
-删除所有找到的数据