Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash SSH命令,用于在除少数指定目录之外的目录中循环_Bash_Loops_Ssh - Fatal编程技术网

Bash SSH命令,用于在除少数指定目录之外的目录中循环

Bash SSH命令,用于在除少数指定目录之外的目录中循环,bash,loops,ssh,Bash,Loops,Ssh,是否可以通过SSH执行bash命令,该命令在多个目录(我指定的3或4除外)上循环?比如: 删除/home/中除/home/exception1/、/home/exception2/和/home/exception3/以外的所有目录的public\u html/oplated/ 我使用的是HostGator专用Linux服务器。这里有一个简单的解决方案-可能有更好的方法来实现这一点 cd /home ls */public_html/outdated 我会告诉你所有这些;您可以使用grep-v从

是否可以通过SSH执行bash命令,该命令在多个目录(我指定的3或4除外)上循环?比如:

删除
/home/
中除
/home/exception1/
/home/exception2/
/home/exception3/
以外的所有目录的
public\u html/oplated/


我使用的是HostGator专用Linux服务器。

这里有一个简单的解决方案-可能有更好的方法来实现这一点

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进行排除,但我永远记不起来了。)

这是一行,但为了可读性,我在这里将其拆分

find /home
    \( -wholename '/home/exception1'
    -o -wholename '/home/exception2'
    -o -wholename '/home/exception3' \)
    -prune -o
  -wholename '*/public_html/outdated' -type d
  -exec rm -rvf \{} \;
在运行此命令之前,我强烈建议替换
-exec rm-rvf\{}位与
-打印
,以验证它是否只打印您要删除的内容。

它的工作原理如下:
find
递归地查找内容。
\(
..
\)中的内容与要完全跳过的目录匹配(即:prune)。使用
-prune
的标准模式是先说出要删掉的内容,然后说出实际要匹配的内容

我们希望匹配
public\u html/outleted
目录,这就是
-wholename'*/public\u html/outleted'-type d
的用途。(
-type d
表示“是一个目录”)

最后是我们想要执行的操作。再次用
-print
替换此部件,直到您确定它符合您的要求

一个警告:这将抛出一系列警告:

find: `/home/foo/public_html/outdated': No such file or directory
这是因为find正在尝试进入它刚刚删除的目录。您可以安全地忽略这些内容——尽管有警告,查找仍将继续。

先测试

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

您可能不想在
public\u html/outleted/
上使用斜杠。您是对的,谢谢@Dennis Williamson我更正了它。您可以尝试使用
-execdir
而不是
-exec
以及
-depth
来查看是否可以消除错误消息。@Dennis我没有尝试过execdir,但是我确实玩过
-depth
,认为它可能会解决问题(就像我们删除子树时所做的那样)。这似乎完全打破了修剪,但是,所以我放弃了这种方法。这是华丽和直接的。我不确定您是否需要重复异常列表中的
home
目录。至少在我把它改成只
(exception1 | exception2 | exception3)
之前它对我不起作用。我还需要执行
shopt-s extglob
来获取
操作员开始工作,但现在工作得很好。对不起,我只是从你的问题中复制和粘贴而没有思考。另外,很抱歉我忘了提到
extglob
。我会更正我的答案。