【问题标题】:Unix command to get list of directories over remote hostUnix命令获取远程主机上的目录列表
【发布时间】:2016-12-18 15:15:45
【问题描述】:

我正在尝试对远程计算机执行 ssh 并获取 pathA(/home/abc/mydata) 中存在的目录名称列表,其中包含在过去 1 小时内已修改的任何文件。

目录:-

/home/abc/mydata
    -> Directory a
        ->file1   last modified 1 hour back
        ->file2   last modified 1 year back
        ->file3   last modified 1 day back
    -> Directory b
        ->file11  last modified 1 year back
        ->file22  last modified 1 year back
        ->file33  last modified 1 year back
        ->Directory b1
          ->fileb1-11 last modified 1 hour back
    -> Directory c
        ->file111  last modified 1 year back
        ->file222  last modified 1 year back
        ->file333  last modified 1 year back

我正在尝试将输出作为

   a  => as it has 1 file which was modified 1 hour back(file1)
   b  => as it has 1 file under sub directory of directory b (fileb1-11)

我正在尝试以下命令

         ssh "host" -t "find /home/abc/mydata -type d  -mmin -60 -ls"

但是我希望最终输出为

  a
  b

但此命令也会列出子目录作为输出。

  a
  b
  b1

一些帮助会很棒。

【问题讨论】:

    标签: shell unix ssh find ls


    【解决方案1】:

    试试:

    ssh "$host" '
    find /home/abc/mydata -mindepth 1 -maxdepth 1 -type d |
    while read -r d; do
        [ "$(find "$d" -mmin -1 -type f -print -quit 2>/dev/null)" ] &&
        ls -ldi "$d"
    done
    '
    

    注意事项:

    • 使用 mindepth/maxdepth,第一个 find 将只查看级别 1。
    • 一个单独的find 将在每个子文件夹中查找最近修改的常规文件 (-type f)。如果其他最近修改的文件类型(子目录/套接字/符号链接)应该触发输出,请删除 -type f
    • ssh-t 参数仅在您想要彩色化 ls 输出时才需要。
    • ls -ldi ... 的输出与find ... -ls 的输出略有不同,但我猜它会做。
    • 第二级find的返回值太模糊,这里不能用。相反,我们只是测试它的输出是否为非空。

    【讨论】:

    • 它列出了深度 1 中存在的所有目录,而不是包含基于时间(-ctime 或 -mtime)修改文件的目录。有什么解决办法吗?
    • 我不明白:在 OP 中你说你想要输出 ab,而不是 ab/b2
    • 是的,但是您的脚本将输出作为 a,b,c 而不是 a,b 即。 mydata 文件夹下的所有目录都显示为输出。
    • 希望已修复。 find返回值太模糊了。
    • 谢谢马太。这看起来像我预期的那样工作。但是,如果我将此脚本作为单行语句并尝试在 shell 上执行,则会出现“bash:-c:第 1 行:语法错误:文件意外结束”错误。我错过了什么?
    【解决方案2】:

    原来的帖子似乎几乎是正确的。这对我有用(使用 Mac BSD):

    ssh <user>@<host> -t "find /home/abc/mydata -mindepth 1 -maxdepth 1 -mmin -60 -type d"
    
    • 需要最小深度参数以避免打印源目录 /home/abc/mydata.
    • 需要最大深度参数,因此我们不打印子目录 一级以下。

    • 删除了 -ls 参数,因为它提供了关于 目录(例如权限),并可能导致问题 提取路径名。

    我还向任何需要更复杂的查找的人推荐使用变量单独构建它以简化调试。这是一个脚本:

    #!/bin/bash
    user=<username>
    host=<hostname>
    path=/home/abc/mydata
    myfind="find ${path} -mindepth 1 -maxdepth 1 -mmin -60 -type d"
    ssh $user@$host -t $myfind
    

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2010-09-06
      • 1970-01-01
      • 2016-01-20
      • 2016-03-19
      相关资源
      最近更新 更多