我正在尝试向正在编写的数据收集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-)"
从这篇文章,但不是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
您尝试使用的代码旨在成为函数的主体;$1
正确调用函数集。就其本身而言,$1
可能未设置,所以find
on上的运算符""/
(与/
)相同,而不是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
这可以简化一点。无需使用find
或xargs
; 一个简单的循环就可以了。而且,由于您现在有了功能,因此无需将所有内容都塞进一行。
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
,因此请确保您的目录名称均不以换行符结尾。(可以修复此极其微小的错误,但是这样做可能不值得;请务必注意。)
它还有一个更大的缺点:由于不会吃掉非尾随的换行符,因此您不能假设循环的输出每行只包含一个文件;一个文件可以占用多行。最简单的解决方法是避免使用换行符的目录名称。一个更强大的修复程序放弃了管道。
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"
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句