Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于查找和显示最旧文件的Bash脚本_Linux_Bash_Unix - Fatal编程技术网

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

Linux 用于查找和显示最旧文件的Bash脚本,linux,bash,unix,Linux,Bash,Unix,我正在尝试编写一个脚本,该脚本将显示从中执行脚本的目录中最旧文件的名称 这就是我到目前为止所做的: #!/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 s

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

这就是我到目前为止所做的:

#!/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: .

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

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

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
output,但如果您理解它的局限性,它对于快速和肮脏的工作来说是不错的


如果您想要一个脚本,即使对于那些坚持在文件名中添加控制字符的狂热者也是如此:-),那么有一些更好的选择,包括:

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

尽管我建议您遵循该链接,以了解为什么
ls
解析通常被认为是一个坏主意(因此,在有限的情况下,例如当您可以保证所有文件都是
YYYY-MM-DD.log
种类时,解析为什么会有用)。那里有一种有用信息的字体。

您可以使用
查找
命令:

find-type f-printf'%T+%p\n'| sort | head-1

以下一行程序在整个子树中查找最旧的文件,并使用长格式和相对完整路径进行报告。你还需要什么

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

请参阅,以了解这是一个坏主意的原因,以及最佳做法的替代方案。Thx,@Charles在其上添加了该链接和一个选项,这似乎满足了此处的特定要求。$*
中的arg的
有问题--请尝试使用包含空格或带引号的通配符的参数,以了解原因<“$@”
中的arg的code>或arg的
(默认行为是迭代
“$@”
)是正确的选择。当然,所有这些都是假设您正在迭代命令行参数,而不是文件……要迭代文件,它是*
中arg的
,可能在循环中使用
[-d“$arg”]&&continue
跳过目录。将其修改为
{IFS=read-r-d''time;IFS=read-r-d''name;}<