用于查找和显示最旧文件的Bash脚本

dko*_*kon 1 unix linux bash

我正在尝试编写一个脚本,该脚本将在执行脚本的目录中显示最旧文件的名称.

这是我到目前为止:

#!/bin/bash
for arg in $*
do
 oldest=$1
 if [[ $arg -ot $oldest ]]
 then
  oldest=$arg
 fi
done

echo "Oldest file: $oldest"
Run Code Online (Sandbox Code Playgroud)

我不知道如何增加到下一个文件来检查它是否更旧

例如:

oldest=$2
oldest=$3
etc..
Run Code Online (Sandbox Code Playgroud)

尝试在bash shell中运行此脚本,给出以下args:

myScript `ls -a`
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

Oldest File: .
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 7

ls程序有一个按时排序的选项,你可以从该输出中获取最后一个文件::

# These are both "wun", not "ell".
#             v          v
oldest="$(ls -1t | tail -1)"
Run Code Online (Sandbox Code Playgroud)

如果要避免使用目录,可以事先将其删除:

# This one's an "ell", this is still a "wun".
              v                         v
oldest="$(ls -lt | grep -v '^d' | tail -1 | awk '{print $NF}')"
Run Code Online (Sandbox Code Playgroud)

我通常不会主张解析ls输出,但它适用于快速和脏的工作,如果你了解它的局限性.


如果你想要一个脚本,即使对于坚持将控制字符放在文件名中的疯子也会有效:-)那么这个页面有一些更好的选择,包括:

unset -v oldest
for file in "$dir"/*; do
    [[ -z $oldest || $file -ot $oldest ]] && oldest=$file
done
Run Code Online (Sandbox Code Playgroud)

虽然我建议按照这个链接来理解为什么 ls解析一般被认为是一个坏主意(因此它可以在有限的情况下有用,例如当你可以保证你的所有文件都是YYYY-MM-DD.log多样的时候).那边有一种有用的信息.

  • 请参阅http://mywiki.wooledge.org/ParsingLs以了解为什么这是一个坏主意,并http://mywiki.wooledge.org/BashFAQ/003获取最佳实践替代方案. (3认同)