在bash脚本中替换ls命令

时间:2018-08-07 21:10:25

标签: bash

每个人都说bad, bad, very bad to use 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

2 个答案:

答案 0 :(得分:1)

如果不使用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])也可以。)

答案 1 :(得分:1)

我怀疑你想要

selinput.select2({