Bash 脚本 cd 到目录中的最新目录
Bash script to cd into newest directory within a directory
我正在尝试向我正在编写的数据收集 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
我曾尝试使用 this post 中的 cd "$( find ""/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"
,但它却让我进入了计算机上的最新目录。
目的是像下面这样的目录结构:
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
您可以使用 ls -ldt */ | head -1
查找最新的子目录:t 选项按日期对文件排序,*/ 仅匹配子目录,不匹配文件。
您尝试使用的代码是函数体;正确调用函数集 </code>。 <code>
本身可能未设置,因此 ""/
上的 find
运算符(与 /
相同),而不是 top_dir
.
new_cd () {
cd "$( find ""/* -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
这可以稍微简化一下。无需使用 find
或 xargs
;一个简单的循环就可以了。既然你现在有了一个函数,就没有必要把所有的东西都塞进一行。
new_cd () {
new_d=$(for d in ""/*/; do
stat -c "%Y %n" "$d" 2> /dev/null
done | sort -nr |
head -n |
cut -d " " -f 2-)
cd "$new_d"
}
这有一个小缺点:命令替换会吃掉 cut
输出中的任何尾随换行符,因此请确保目录名称的 none 以换行符结尾。 (这个非常小的错误可以修复,但可能不值得这样做;请注意它。)
它还有一个更大的缺点:因为非尾随换行符不会被吃掉,你不能假设循环的输出每行仅包含一个文件;单个文件可能占用多行。最简单的解决方法是避免使用换行符的目录名称。更强大的修复放弃了管道。
new_cd () {
local newest_time newest_d
for d in ""/*/; do
t=$(stat -c "%Y" "$d")
if (( t > newest_time )); then
newest_time=$t
newest_d=$d
fi
done
cd "$newest_d"
}
我正在尝试向我正在编写的数据收集 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
我曾尝试使用 this post 中的 cd "$( find ""/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"
,但它却让我进入了计算机上的最新目录。
目的是像下面这样的目录结构:
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
您可以使用 ls -ldt */ | head -1
查找最新的子目录:t 选项按日期对文件排序,*/ 仅匹配子目录,不匹配文件。
您尝试使用的代码是函数体;正确调用函数集 </code>。 <code>
本身可能未设置,因此 ""/
上的 find
运算符(与 /
相同),而不是 top_dir
.
new_cd () {
cd "$( find ""/* -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
这可以稍微简化一下。无需使用 find
或 xargs
;一个简单的循环就可以了。既然你现在有了一个函数,就没有必要把所有的东西都塞进一行。
new_cd () {
new_d=$(for d in ""/*/; do
stat -c "%Y %n" "$d" 2> /dev/null
done | sort -nr |
head -n |
cut -d " " -f 2-)
cd "$new_d"
}
这有一个小缺点:命令替换会吃掉 cut
输出中的任何尾随换行符,因此请确保目录名称的 none 以换行符结尾。 (这个非常小的错误可以修复,但可能不值得这样做;请注意它。)
它还有一个更大的缺点:因为非尾随换行符不会被吃掉,你不能假设循环的输出每行仅包含一个文件;单个文件可能占用多行。最简单的解决方法是避免使用换行符的目录名称。更强大的修复放弃了管道。
new_cd () {
local newest_time newest_d
for d in ""/*/; do
t=$(stat -c "%Y" "$d")
if (( t > newest_time )); then
newest_time=$t
newest_d=$d
fi
done
cd "$newest_d"
}