【问题标题】:SSH command for looping through directories EXCEPT a few specified用于遍历目录的 SSH 命令,除了一些指定的目录
【发布时间】:2011-05-23 16:03:38
【问题描述】:

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

删除/home/ 中除/home/exception1//home/exception2//home/exception3/ 之外的所有目录的public_html/outdated/

我在 HostGator 专用 Linux 服务器上。

【问题讨论】:

  • 您可能不打算在 public_html/outdated/ 上添加斜线
  • 你说得对,谢谢@Dennis Williamson 我更正了。

标签: bash loops ssh


【解决方案1】:

先测试!

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

【讨论】:

  • 这是华丽而直接的。我不确定您是否需要在例外列表中重复 home 目录。至少在我将其更改为 (exception1|exception2|exception3) 之前它对我不起作用。
  • 我还需要执行shopt -s extglob 才能使! 运算符工作,但它现在工作得很好。
  • 对不起,我只是从你的问题中复制和粘贴,没有考虑。另外,很抱歉我忘了提到extglob。我会更正我的答案。
【解决方案2】:

这都是一行,但为了便于阅读,我在此处将其拆分

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 \{} \; 位替换为 -print,以验证它是否只打印您要删除的内容。

它的工作原理如下:find 递归查找内容。 \(...\)' matches directories you want to skip entirely (ie: prune). The standard pattern for using-pruneis 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

这是因为 find 试图进入它刚刚删除的那些目录。您可以放心地忽略这些——尽管出现警告,查找仍将继续。

【讨论】:

  • 您可以尝试使用-execdir 而不是-exec 以及-depth 来查看是否可以消除错误消息。
  • @Dennis 我没有尝试过 execdir,但我确实使用了-depth,认为它可能会解决问题(因为我们在删除它时已经完成了子树) .然而,这似乎完全破坏了修剪,所以我放弃了这种方法。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多