【问题标题】:Shell: How to iterate over directories names and get two latest?Shell:如何遍历目录名称并获得两个最新的?
【发布时间】:2017-05-19 23:20:06
【问题描述】:

假设我在 aws s3 存储桶上有以下目录名称。此输出由aws s3 ls 返回:

PRE 20161205_1248/
PRE 20161207_1613/
PRE 20161211_1732/
PRE 20161213_1806/
PRE 20161216_0603/
PRE 20161219_0255/
PRE 20161224_1350/
PRE 20161226_1915/
PRE 20161229_0154/
PRE 20161231_1139/

目录名称是时间戳,最新的是:

20161205_1248

如何遍历目录名称以获取最新的目录名称?我是 shell 脚本的新手,如果有任何帮助,我将不胜感激

【问题讨论】:

  • 20161205_1248 不是最旧的,20161231_1139 是最新的吗?你的实际输出是多少。

标签: bash shell scripting


【解决方案1】:
  1. 用ls列出目录下的所有文件
  2. 使用 sort 对它们进行递归排序
  3. 用尾部获取最后 2 行
  4. 得到这个分数的第一行带头

    ls | sort -r | tail -2 | head -1
    

如果您将 lastest 与 last 混淆,请不要使用 -r 选项进行排序。

【讨论】:

  • 或者,使用sed 打印特定行,例如ls | sort -r | sed -n '2{p;q}'
  • 是的,你的命令更短。但是在 q 命令之后留下分号给了我一条错误消息(在 Mac 上)。你需要 q 还是 sed -n '2p' 会这样做?
  • 我想严格来说,q 不是必需的 - 它只是提前退出并避免读取文件/输入的其余部分。在这种情况下,由于输入是如此之小,它可能无关紧要,但如果你从 30 亿或其他东西中提取一个特定的行,它可以产生明显的差异。
  • 谢谢!经过一些研究后,我发现 aws ls 实际上将列表返回为字符串,例如 PRE DIR1/PRE DIR2/PRE DIR3/ 但就我只需要得到 'DIR3' 而言,我设法得到它就像 function test { dir=$(aws s3 ls s3://dir_location/ | sort -r) read -a arr <<<$dir echo ${arr[3]} | sed s'/.$//' }
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2016-10-25
  • 1970-01-01
相关资源
最近更新 更多