用于删除所选目录的shell脚本

时间:2010-01-19 12:13:21

标签: shell

我有一堆dirs,比如** a,b,c0,d,Z,foo,**等等。

我想删除除dirs foo,foo2,a b

之外的所有目录

任何人都可以为我提供执行此shell的语法吗?

由于

更新 我只想说谢谢大家的回复!

5 个答案:

答案 0 :(得分:4)

echo `ls -1 -d */ | egrep -v '^(foo|foo2|a|b)/$'`

如果您对输出感到满意,请将echo替换为rmdir(或rm -r,如果目录仍包含数据的话。)

答案 1 :(得分:3)

可能是最简单的方式;

mkdir ../tempdir
mv foo foo2 a b ../tempdir
rm *
mv ../tempdir/* .
rmdir ../tempdir

请注意,这也会删除所有文件,而不仅仅删除目录。

答案 2 :(得分:1)

您可以在复杂的命令行上使用find,但也许最简单,最重要,最安全的方法是创建一个列出您要删除的所有目录的文件。然后使用该文件作为rm的输入,如下所示:

find . -maxdepth 1 -type d > dirs_to_remove

现在编辑文件并取出您要保留的所有目录,然后使用rm

rm -ir $(<edited_dirs_to_remove)

注意-i参数。它是可选的,强制rm在删除每个文件之前询问您。 另请注意$(<filename)语法,该语法特定于bash并且相当于$(cat filename),但比{{1}}便宜。

答案 3 :(得分:1)

使用find + grep + xargs来实现这种技巧的更有效方法之一是:

DONT_REMOVE='a|b|c0|d|Z|foo'
find . -type d -print | egrep -v "^\.$DONT_REMOVE\$" | xargs rm -r

这里唯一的技巧是确保模式仅匹配您不想删除的模式。 上述模式仅匹配当前目录中的文件。你可以或多或少地做到 允许的,例如:

IF_PATH_IS_IMMEDIATE_SUBDIR="^\./($DONT_REMOVE)$"
IF_PATH_ENDS_IN="/($DONT_REMOVE)$"
IF_PATH_CONTAINS="/($DONT_REMOVE)(/.*)?$"

然后在你的egrep中传递其中一个,例如:

find . -type d -print | egrep -v "$IF_PATH_ENDS_IN" | xargs rm -r

要反转选择(即删除所有这些项目),只需从egrep中删除-v

答案 4 :(得分:0)

单程

find . -maxdepth 1 -type d \( ! -name "bar" -a ! -name "foo" -a ! -name "a" -a ! -name "b" \) -delete  # to remove files as well, remove -type d

或尝试使用extglob

shopt -s extglob
rm -rf !(foo|bar|a|b)/  # to delete files as well, remove the last "/"

是的,假设你不想要你目录中的其他目录,除了你想要的4个目录。