是否可以通过SSH执行一个bash命令,该命令在多个目录上循环,除了我指定的3或4之外?喜欢的东西:用于循环目录的SSH命令除了指定的几个之外
删除public_html/outdated/
所有目录中/home/
除了/home/exception1/
,/home/exception2/
和/home/exception3/
我在专用的Linux服务器HostGator的。
是否可以通过SSH执行一个bash命令,该命令在多个目录上循环,除了我指定的3或4之外?喜欢的东西:用于循环目录的SSH命令除了指定的几个之外
删除public_html/outdated/
所有目录中/home/
除了/home/exception1/
,/home/exception2/
和/home/exception3/
我在专用的Linux服务器HostGator的。
先测试!
shopt -s extglob
rm -rf /home/!(exception1|exception2|exception3)/public_html/outdated/
下面是一个简单的解决方案 - 可能有更好的方法来做到这一点。
cd /home
ls */public_html/outdated
将你所有的那些;你可以使用grep -v从该
ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/
删除线,然后使用反引号将这些反馈到rm -rf
rm -rf `ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/`
显然,你应该运行的中间步骤,以验证列表之前实际上是删除它们!
请注意,如果您的任何目录中有空格,这可能不起作用 - 尽管/ home中的用户名不应该。安全的方法是使用find
。 (有可能是一个方式做发现排除,但我永远记得。)
这是一点整行,但是我在这里把它分解为可读性
find /home
\(-wholename '/home/exception1'
-o -wholename '/home/exception2'
-o -wholename '/home/exception3' \)
-prune -o
-wholename '*/public_html/outdated' -type d
-exec rm -rvf \{} \;
强烈运行此我之前建议用-print
替换-exec rm -rvf \{} \;
位以验证它是否仅打印要删除的内容。
下面是它的工作方式:find
递归找到东西。在\(
... \)' matches directories you want to skip entirely (ie: prune). The standard pattern for using
-prune is to say what you want to prune out, then
-prune -o`的东西,然后你真正想要匹配的东西。
我们想匹配public_html/outdated
目录,所以这就是-wholename '*/public_html/outdated' -type d
的目的。 (-type d
的意思是“是一个目录”)。
最后是我们要执行的操作。再一次,用-print
代替这部分,直到你确定它做到了你想要的。
警告:这会吐出一堆形式的警告:
find: `/home/foo/public_html/outdated': No such file or directory
这是因为找到的是试图走进它只是删除这些目录。你可以放心地忽略这些 - 尽管有警告,但会继续发现。
您可以尝试使用'-execdir'而不是'-exec'以及'-depth'来查看是否消除了错误消息。 – 2010-12-11 01:52:58
@丹尼斯我还没有试过execdir,但是我确实玩过'-depth',认为它可以解决问题(因为我们在删除它时会使用子树)。这似乎彻底打破了修剪,但是,所以我放弃了这种方法。 – 2010-12-11 02:44:20
你可能不打算对初始的斜杠'的public_html /过时/' – 2010-12-11 01:39:32
你说得对,谢谢@Dennis威廉姆森我纠正它。 – filip 2010-12-11 01:42:24