我有一堆dirs,比如** a,b,c0,d,Z,foo,**等等。
我想删除除dirs foo,foo2,a 和 b
之外的所有目录任何人都可以为我提供执行此shell的语法吗?
由于
更新 我只想说谢谢大家的回复!
答案 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个目录。