所以使用shell,并有一个目录:
./parent
./parent/one
./parent/two
./parent/three
./parent/four
Run Code Online (Sandbox Code Playgroud)
我想rm -rf parent/*在一个命令中执行某些操作,但保留一个目录,例如"四个",因此最终结果将是
./parent
./parent/four
Run Code Online (Sandbox Code Playgroud)
Eta*_*ner 20
有了bash你可以用这样做extglob的选项shopt.
shopt -s extglob
cd parent
rm -rf !(four)
Run Code Online (Sandbox Code Playgroud)
使用posix shell我认为你可以使用循环来做到这一点
for dir in ./parent/*; do
[ "$dir" = "four" ] && continue
rm -rf "$dir"
done
Run Code Online (Sandbox Code Playgroud)
或使用数组rm只运行一次(但它需要数组或使用"$@")
arr=()
for dir in ./parent/*; do
[ "$dir" = "four" ] && continue
arr+=("$dir")
done
rm -rf "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)
要么
for dir in ./parent/*; do
[ "$dir" = "four" ] && continue
set -- "$@" "$dir"
done
rm -rf "$@"
Run Code Online (Sandbox Code Playgroud)
或者你可以使用 find
find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
或(与find拥有-exec +,以节省一些rm处决)
find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)
哦,或者假设目录列表不是太大而且笨重,我想你总是可以使用
rm -rf parent/*<ctrl-x>*
Run Code Online (Sandbox Code Playgroud)
然后删除parent/four从命令行的输入和命中enter其中<ctrl-x>*的readline的默认绑定glob-expand-word.
Ged*_*RSU 20
我认为最简单实用的方法是将异常移动到父文件夹,删除所有内容将其移回
mv exceptionFolder ..
rm -rf *
mv ../exceptionFolder .
Run Code Online (Sandbox Code Playgroud)
编辑:如果没有父目录
mkdir todelete
mv * todelete/
mv todelete/exceptionFolder .
rm -rf todelete
Run Code Online (Sandbox Code Playgroud)
小智 11
另一种方法是
rm -r $(ls -A | grep -v important_folder)
Run Code Online (Sandbox Code Playgroud)
ls -A列出所有文件和文件夹(. 和 .. 除外)。
grep -v expression从列表中删除与 grep 表达式匹配的任何内容。