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

And*_*dez 9 shell posix

所以使用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.

  • 很好的答案.我通常只是`mv`目录并删除其他所有内容.;)+1 (3认同)
  • 小心!所写的 `find` 也将匹配 `./parent`! (2认同)

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 表达式匹配的任何内容。

  • 您还可以向 grep 添加 `-E` 标志以使用捕获组和 `|`,然后您可以轻松添加更多文件夹:`grep -vE "(file1)|(file2)"` 查找除这两个文件之外的所有内容。 (2认同)