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

delete all directories except one

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

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

我想在一个命令中做类似 rm -rf parent/* 的事情,但保留一个目录,例如 'four',所以最终结果将是

./parent
./parent/four

使用 bash,您可以使用 shoptextglob 选项执行此操作。

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 的默认绑定。

你可以用 find

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

find - 它的命令搜索 files/directories

-maxdepth 1 - 未找到 foldder_name 个子类别

. ! -name foldder_name - 意思是在当前目录.中搜索,不要用他的真实名字来查找这个文件:! -name foldder_name

-type d - 仅查找目录

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

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

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

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

编辑:如果没有父目录

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

另一种方法是

rm -r $(ls -A | grep -v important_folder)

ls -A 列出所有文件和文件夹(. 和 .. 除外)。

grep -v expression 从列表中删除与 grep 表达式匹配的任何内容。