将Bash脚本cd到目录中的最新目录

Jer*_* M. 1 bash directory-structure

我正在尝试向正在编写的数据收集bash脚本中添加功能。目的是指向一个特定的目录,然后在父目录中cd进入NEWEST目录。

伪代码:

cd top_dir
    for each dir in top_dir:
      age = dir.age
      if age < least_age:
        least_age = age
        newest_dir = dir

    cd newest_dir
Run Code Online (Sandbox Code Playgroud)

我曾尝试cd "$( find "$1"/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"这篇文章中使用,但是cd将我引导到计算机上的最新目录中。

目的是建立如下所示的目录结构:

parent_dir:
  child_1 | Last Edited 1 Hr Ago
  child_2 | Last Edited 1 Yr Ago
  child_3 | Last Edited 2 Yr Ago
  child_4 | Last Edited 1 Min Ago
  child_5 | Last Edited 1 Week Ago
Run Code Online (Sandbox Code Playgroud)

命令将cd我带入child_4

che*_*ner 5

您尝试使用的代码旨在成为函数的主体;$1正确调用函数集。就其本身而言,$1可能未设置,因此findon上的运算符""/(与/)相同,而not top_dir

new_cd () {
  cd "$( find "$1"/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"
}

new_cd top_dir
Run Code Online (Sandbox Code Playgroud)

这可以简化一点。无需使用findxargs; 一个简单的循环就可以了。而且由于您现在有了一个功能,所以无需将所有内容都塞进一行。

new_cd () {
  new_d=$(for d in "$1"/*/; do
      stat -c "%Y %n" "$d" 2> /dev/null
  done | sort -nr |
         head -n |
         cut -d " " -f 2-)
  cd "$new_d"
}
Run Code Online (Sandbox Code Playgroud)

这有一个小缺点:命令替换将占用的输出中的所有尾随换行符cut,因此请确保您的目录名称均不以换行符结尾。(可以修复此极其微小的错误,但是这样做可能不值得;请务必注意。)

它还有一个更大的缺点:由于不会吃掉尾随的换行符,因此您不能假设循环的输出每行只包含一个文件;一个文件可以占用多行。最简单的解决方法是避免使用换行符的目录名称。一个更强大的修复程序放弃了管道。

new_cd () {
  local newest_time newest_d
  for d in "$1"/*/; do
    t=$(stat -c "%Y" "$d")
    if (( t > newest_time )); then
      newest_time=$t
      newest_d=$d
    fi
  done
  cd "$newest_d"
}
Run Code Online (Sandbox Code Playgroud)