Bash 循环文件并根据日期获取最近的文件

Bash 循环文件并根据日期获取最近的文件,bash,Bash,我正在尝试循环文件,并根据最近的日期获取文件名 我的目录中有一个格式一致的文件列表 filename_XXX_20_01_2021.txt filename_XXX_03_03_2021.txt filename_XXX_03_02_2021.txt filename_XXX_04_01_2020.txt filename_XXX_20_01_2020.txt 我正在尝试获取结果文件名_XXX_03_03_2021.txt,因为这是根据日期生成的最新文件 我尝试了下面的命令

我正在尝试循环文件,并根据最近的日期获取文件名

我的目录中有一个格式一致的文件列表

  filename_XXX_20_01_2021.txt
  filename_XXX_03_03_2021.txt
  filename_XXX_03_02_2021.txt
  filename_XXX_04_01_2020.txt
  filename_XXX_20_01_2020.txt
我正在尝试获取结果文件名_XXX_03_03_2021.txt,因为这是根据日期生成的最新文件

我尝试了下面的命令,但这会根据“更改”日期获取文件


任何建议/线索都将不胜感激。

在普通的
bash
中,在不使用任何外部命令行实用程序的情况下,以下脚本将根据问题中指定的文件名格式打印最新文件的名称:

#!/bin/bash

suffix='[0-9][0-9]_[0-9][0-9]_[0-9][0-9][0-9][0-9].txt'

latestdate=0
for file in *_$suffix; do
        IFS=_ read d m y <<< "${file#"${file%$suffix}"}"
        date=${y%.txt}$m$d
        ((date > latestdate)) && { latestdate=$date; latestfile=$file; }
done
echo "$latestfile"
#/bin/bash
后缀='[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt'
latestdate=0
对于后缀为*u$的文件;做

如果要根据文件名进行排序,可以使用以下方法:

find -name 'filename*' -printf '%P\n' | sed -E 's/.*_([0-9]{2})_([0-9]{2})_([0-9]{4}).txt/& \3-\2-\1/' | sort -k2V | cut -f1 -d' '
find
查找前缀为
filename
的所有文件。
sed
附加一个可以排序的日期字段(例如,对于
20\u 01\u 2021
它添加了
2021-01-20

排序
根据添加的字段日期对文件名重新排序
cut
删除添加的日期

请注意,如果文件是根据文件名日期创建的,则可以避免使用
sed
命令:

find -name 'filename*' -printf "%T+ %P\n" | sort | cut -f2 -d' '

对日期(YYYY-MM-DD)使用ISO8601表示法,这样您就可以按字母顺序对它们进行排序了。艾丁:一旦for循环运行,我就会得到错误“-bash:(:02_2021031003:值太大,不适合基值(错误标记为“02_2021031003”)-bash:(:03_2020031003:值太大,不适合基值(错误标记为“03_2020031003”)-bash:((:03_2021031003:value对base太大(错误标记为“03_2021031003”)“@user3447653那么我怀疑您的文件名格式不一致。您能给出确切的文件名吗?(其中一些)projectname_extraction_1004_31_03_2020.txt,projectname_extraction_1002_31_03_2020.txt projectname_extraction_1004_03_2021.txt projectname_extraction_1002_03_2021。txt@user3447653更新了答案。
find -name 'filename*' -printf "%T+ %P\n" | sort | cut -f2 -d' '