【问题标题】:How to find the latest folder in a directory and then make a full path accordingly?如何在目录中找到最新的文件夹,然后相应地制作完整路径?
【发布时间】:2013-12-24 00:54:06
【问题描述】:

我有一个目录,里面有一些文件夹和一些文件。假设这是我的当前目录,如下所示,使用pwd 命令 -

david@slc4b03c:/bat/data/snapshot$ pwd
/bat/data/snapshot

我登录到machineA

这个/bat/data/snapshot 目录将包含一些文件夹和一些文件,如下所示 -

david@slc4b03c:/bat/data/snapshot$ ls -lt
total 22400264
drwxr-xr-x 2 cronusapp app   102400 2013-12-22 04:01 20131222
drwxr-xr-x 2 cronusapp app   102400 2013-12-16 03:00 20131215
-rw-r--r-- 1 cronusapp app 26412620 2013-12-13 02:04 weekly_003_5.data
-rw-r--r-- 1 cronusapp app 26492037 2013-12-13 02:02 weekly_003_5.data
-rw-r--r-- 1 cronusapp app 26480695 2013-12-13 02:02 weekly_003_5.data
-rw-r--r-- 1 cronusapp app 26475266 2013-12-13 02:02 weekly_003_5.data
-rw-r--r-- 1 cronusapp app 26471366 2013-12-13 02:02 weekly_003_5.data
-rw-r--r-- 1 cronusapp app 26455311 2013-12-13 02:02 weekly_003_5.data

所以我拥有的两个文件夹是2013122220131215,如上所示。现在我想从中提取最新的文件夹,即20131222,因为它比20131215 更新。然后像这样制作一个完整的路径 -

/bat/data/snapshot/20131222/

因为我需要在从那台机器执行 scp 到另一台机器时使用这个完整路径,

下面是我的 shell 脚本,我在其中硬编码了当前使用 20131222 的最近路径,但总的来说,我需要通过使用下面的 shell 脚本查看哪个文件夹是最新的文件夹来制作完整路径。.

#!/bin/bash

readonly LOCATION=/bat/data/snapshot

scp david@slc4b03c.slc.host.com:/bat/data/snapshot/20131222/weekly_003_5.data /data01/primary/.

上面的shell脚本我不会在机器A上运行。我将在不同的机器上运行,假设它是machineB

是否可以在 shell 脚本中执行此操作?

【问题讨论】:

  • 您的列表似乎显示相同的文件夹名称出现了 6 次(有一些大小差异);这是一个编辑错误,还是以 0-5 个空格结尾,或者其他类似的东西?
  • @JonathanLeffler: 没错,那是编辑时弄错了.. 很抱歉..

标签: linux bash shell unix ubuntu


【解决方案1】:

有很多方法可以做到这一点,但作为一个快速而肮脏的方法,我会使用 findsorttail 的组合:

dir=`find $LOCATION -type d | sort | tail -1`

通过将$LOCATION 指定为find 的路径,您将自动获取附加到输出的目录,这应该让sorttail 给您答案,而无需对当前目录进行任何进一步的插值。

【讨论】:

  • 非常感谢 Palpatim 的建议。我们是否也可以验证我们得到的dir的任何值都是YYYYMMDD的形式如果是这种形式,那么我只能说我需要使用这个目录..
【解决方案2】:

我认为,您正在寻找特定目录上的最新目录,请使用以下命令获取最新目录并分配任何变量

ls | sort | tail -1

【讨论】:

    【解决方案3】:

    简单但不可靠的解决方案

    dir=$(ls -dt1 "$LOCATION"/*/ | head -n1)
    scp "david@slc4b03c.slc.host.com:$dir"/weekly_003_5.data /data01/primary/.
    

    如果最新目录的名称包含换行符或其他困难字符,上述操作将失败。

    如果您想按照您的示例将目录名称限制为日期 (YYYYMMDD) 的形式,请尝试:

    dir=$(ls -dt1 "$LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ | head -n1)
    

    有关以这种方式使用ls 的问题的更多信息,请参阅:

    更强大的解决方案(需要 GNU 工具)

    此代码使用 find 和 NUL 分隔的输出来处理难以处理的文件名:

    dir=$(find "$LOCATION" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\0' |sort -znr | sed -zE 's/^[^ ]+ //;q')
    

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多