Bash脚本可以cd到目录中的最新目录

问题描述 投票:1回答:2

我正在尝试将函数添加到我正在编写的数据集合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

我已经尝试过使用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-)"this post,但是我将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

命令将cd我变成child_4

bash directory-structure
2个回答
5
投票

您尝试使用的代码旨在成为函数的主体;调用函数正确设置$1。本身,$1可能没有设置,所以find运营商在""/(与/相同),而不是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

这可以简化一点。没有必要使用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"
}

这有一个小缺点:命令替换将占用cut输出中的任何尾随换行符,因此请确保您的目录名称都不以换行符结尾。 (这个极小的bug可以修复,但可能不值得这样做;只要注意它。)

它也有一个更大的缺点:由于没有吃掉非追踪换行符,你不能假设循环的输出只包含每行一个文件;单个文件可能占用多行。最简单的解决方法是避免使用换行符的目录名称。更强大的修复放弃了管道。

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"
}

2
投票

您可以使用ls -ldt */ | head -1找到最新的子目录:t选项按日期排序文件,* /仅匹配子目录,而不匹配文件。

© www.soinside.com 2019 - 2024. All rights reserved.