【问题标题】:Bash script to find and display oldest file用于查找和显示最旧文件的 Bash 脚本
【发布时间】:2015-01-21 17:06:00
【问题描述】:

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

这是我目前所拥有的:

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

echo "Oldest file: $oldest"

我不确定如何递增到下一个文件以检查它是否较旧

例如:

oldest=$2
oldest=$3
etc..

尝试在给定以下参数的 bash shell 中运行此脚本:

myScript `ls -a`

我得到以下结果:

Oldest File: .

【问题讨论】:

  • for arg in $* 有问题 - 尝试使用包含空格或带引号的通配符的参数以了解原因。 for arg in "$@" 或只是 for arg(默认行为是迭代 "$@")是正确的选择。当然,所有这些都假设您正在迭代命令行参数,而不是文件。
  • ...要遍历文件,它是for arg in *,可能在循环内带有[ -d "$arg" ] && continue 以跳过目录。

标签: linux bash unix


【解决方案1】:

下面的 oneliner 在整个子树中查找最旧的文件,并使用长格式和相对完整路径报告它。你还需要什么?

ls -ltd $(find . -type f) | tail -1

【讨论】:

    【解决方案2】:

    您可以使用此功能在任何目录中查找最旧的文件/目录:

    oldest() { 
       oldf=
       for f in *; do
          # not a file, ignore
          [[ ! -f "$f" ]] && continue
          # find oldest entry
          [[ -z "$oldf" ]] && oldf="$f" || [[ "$f" -ot "$oldf" ]] && oldf="$f"
       done
       printf '%s\n' "$oldf"
    }
    

    并在任何目录中调用它:

    oldest
    

    【讨论】:

      【解决方案3】:

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

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

      如果你想避免使用目录,你可以预先把它们去掉:

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

      我通常不提倡解析 ls 输出,但它适用于快速而肮脏的工作,如果您了解它的局限性。


      如果您想要一个脚本,即使对于那些坚持在文件名中添加控制字符的疯子也能工作 :-) 那么this page 有一些更好的选择,包括:

      unset -v oldest
      for file in "$dir"/*; do
          [[ -z $oldest || $file -ot $oldest ]] && oldest=$file
      done
      

      虽然我建议点击该链接以了解 为什么 ls 解析通常被认为是一个坏主意(因此为什么它在有限的情况下很有用,例如当你可以 保证您所有的文件都属于YYYY-MM-DD.log 类型)。那里有一堆有用的信息。

      【讨论】:

      【解决方案4】:

      您可以使用find 命令: find -type f -printf '%T+ %p\n' | sort | head -1

      【讨论】:

      • 将其修改为{ IFS= read -r -d' ' time; IFS= read -r -d '' name; } < <(find -type f -printf '%T+ %p\0' | sort -z) 并使用所有可能的文件名,包括带有换行符的文件名(您当前的代码无法处理)。当然,需要 GNU 排序,但因为您已经依赖 GNU 扩展来查找...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多