删除除一个目录外的所有目录
delete all directories except one
所以使用 shell,并有一个目录:
./parent
./parent/one
./parent/two
./parent/three
./parent/four
我想在一个命令中做类似 rm -rf parent/*
的事情,但保留一个目录,例如 'four',所以最终结果将是
./parent
./parent/four
使用 bash
,您可以使用 shopt
的 extglob
选项执行此操作。
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 表达式匹配的任何内容。
所以使用 shell,并有一个目录:
./parent
./parent/one
./parent/two
./parent/three
./parent/four
我想在一个命令中做类似 rm -rf parent/*
的事情,但保留一个目录,例如 'four',所以最终结果将是
./parent
./parent/four
使用 bash
,您可以使用 shopt
的 extglob
选项执行此操作。
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 表达式匹配的任何内容。