如何创建指向目标目录中最新目录的符号链接?

时间:2019-04-12 20:55:58

标签: linux bash

我一直在阅读各种有关Stack Overflow的类似问题,但在创建符号链接时仍然遇到困难,该符号链接已成功创建,指向给定目标目录中的最新目录。

这个故事的背景是,我们有一个部署脚本,该脚本需要在通过符号链接引用的目录中使用最新发行版。

为了尝试这种结构,我创建了一个简单的目录“ testSymLinks / target /”,并将目标的以下子目录分别为“ test1 /”,“ test2 /”等。因此总的来说,我将其作为我的结构:

testSymLinks/
--target/
**latest (symbolic link)
-----test1/
-----test2/ (created second / as the latest, new directory)

首先,我一直在尝试创建符号链接“ latest”(位于“ testSymLinks /”中),以指向“ target /”的最新子目录,即“ test2 /”,其中包含以下内容尝试:

尝试1:

ln -sf target/`ls -rt target | tail -n1` latest

Link since apparently I cannot post pictures yet and I need a backtick #NotNewbieFriendly

尝试2:

ln -sf target/`ls -td -- */ | head -n 1` latest

Link since apparently I cannot post pictures yet and I need a backtick #NotNewbieFriendly

这两种尝试都仍然具有指向目录“ target /”的符号链接“最新”,而不是到目前为止的“ target /”中的最新子目录。我一直在通过运行 ls -lrt readlink -f Latest 进行检查。

Link since apparently I cannot post pictures yet #NotNewbieFriendly

我试图查看我在这里缺少的内容,希望能找到任何建议,解释和建议,以便我不仅能够解决我的问题,而且还了解为什么它在第一名。

3 个答案:

答案 0 :(得分:0)

这对我来说可以创建一个指向文件夹中最后创建的目录的符号链接:

$ mkdir target/f
$ mkdir target
$ mkdir target/a
$ mkdir target/b
$ mkdir target/g
$ mkdir target/c
$ mkdir target/h
$ mkdir target/d
$ ls target
a  b  c  d  f  g  h
$ ln -s $(ls -t --group-directories-first target | head -n 1) target/latest
$ ls target -la
total 0
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:18 .
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 ..
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 a
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 b
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 d
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 f
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 g
drwxrwxrwx 1 paulos paulos 4096 Apr 12 18:17 h
lrwxrwxrwx 1 paulos paulos    1 Apr 12 18:18 latest -> d

答案 1 :(得分:0)

尝试

$ ln -sf "$(ls -1dt target/*/ | sed 1q)" latest

请注意,没有错误处理...

答案 2 :(得分:0)

因此,该任务由两个子任务组成:

  • 查找最新目录
  • 创建符号链接

第二步很容易,第一步很难。

这就是我最终得到的:

ln -sf "target/$(find target -type d -mindepth 1 -maxdepth 1 -printf "%T@ %f\n" |
    sort -n -k1 | tail -n1 | cut -d' ' -f2-)" latest

find打印target目录中的目录,其最后一次修改时间为unix时间戳%T@,并打印目录名称$f,并用换行符分隔。然后,我使用第一个字段对列表进行数字排序,获取最后一行并删除时间戳。之后,符号链接的创建将保持不变。

我发现您的第一个解决方案有效,但是我建议至少将-1选项与ls一起使用。第二个创建到target/target/test2的符号链接,您应该删除第一个target/。请注意,ls是高度自定义的实用程序,大多数别名是某些ls --color -F的别名,不建议在脚本中使用。反引号``也已弃用,请改用$( .. )