2010-12-10 23 views
3

是否可以通过SSH执行一个bash命令,该命令在多个目录上循环,除了我指定的3或4之外?喜欢的东西:用于循环目录的SSH命令除了指定的几个之外

删除public_html/outdated/所有目录中/home/除了/home/exception1//home/exception2//home/exception3/

我在专用的Linux服务器HostGator的。

+0

你可能不打算对初始的斜杠'的public_html /过时/' – 2010-12-11 01:39:32

+0

你说得对,谢谢@Dennis威廉姆森我纠正它。 – filip 2010-12-11 01:42:24

回答

2

先测试!

shopt -s extglob 
rm -rf /home/!(exception1|exception2|exception3)/public_html/outdated/ 
+0

这是华丽和直接。我不确定是否需要重复例外列表中的“主目录”。至少它没有为我工作,直到我将它改为“(exception1 | exception2 | exception3)'。 – filip 2010-12-11 12:22:51

+0

此外,我需要执行'shopt -s extglob'来让'!'操作符工作,但现在它工作得很好。 – filip 2010-12-11 12:25:54

+0

对不起,我只是在没有想到的情况下复制并粘贴你的问题。另外,对不起,我忘了提及'extglob'。我会纠正我的答案。 – 2010-12-11 15:15:08

1

下面是一个简单的解决方案 - 可能有更好的方法来做到这一点。

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。 (有可能是一个方式做发现排除,但我永远记得。)

3

这是一点整行,但是我在这里把它分解为可读性

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 

这是因为找到的是试图走进它只是删除这些目录。你可以放心地忽略这些 - 尽管有警告,但会继续发现。

+0

您可以尝试使用'-execdir'而不是'-exec'以及'-depth'来查看是否消除了错误消息。 – 2010-12-11 01:52:58

+0

@丹尼斯我还没有试过execdir,但是我确实玩过'-depth',认为它可以解决问题(因为我们在删除它时会使用子树)。这似乎彻底打破了修剪,但是,所以我放弃了这种方法。 – 2010-12-11 02:44:20

相关问题