繁体   English   中英

在bash脚本中替换ls命令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM