![](/img/trans.png)
[英]Passing ( cd / && ls ) command as variable to a bash script
[英]replacing ls command in a bash script
所有人都说使用ls进行解析是很糟糕的,非常糟糕的 。 这是一个将选择日志文件的脚本。 我不想遍历整个目录,$ 1是我要查看的文件名,而在那些文件中,我只想查看最后两个。 不使用ls怎么办?
for i in $(ls -ltr ~/logs/autosys/*${1}* | tail -2) ; do
if [[ ${i} =~ ".out" ]] ; then
tailpath=$(echo ${i%.*} | awk '{print $9}')
fi
done
如果不使用ls
,则将无条件遍历文件,在每个文件上调用stat
,并自己跟踪两个最新文件。
t0=0
t1=0
for i in ~/logs/autosys/*"${1}"*; do
# Assuming GNU stat; syntax for other implementations may vary
t=$(stat -c "%Y" "$i")
if (( t > t0 )); then
f1=$f0
f0=$i
t1=$t0
t0=$t
elif (( t > t1 )); then
t1=$t
f1=$i
fi
done
现在$f0
和$f1
包含两个最新文件的名称。
事实是, bash
并不适合轻松高效地完成此任务。 ( bash
发行版确实包含一个内置的stat
命令,但似乎并不普遍安装。)
另一方面, zsh
使此任务相当容易:
% files=(~/logs/autosys/*${1}*(Om[-2,-1]))
全局修饰符Om
和[-2,-1]
按修改日期排序并将匹配分别限制为最后两个元素。 ( (om[1,2])
也可以。)
我怀疑你想要
logfile=$(stat -c "%Y:%n" ~/logs/autosys/*"$1"*.out | sort -t: -k1,1n | tail -1 | cut -d: -f2-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.