按生产日期索引的文件

时间:2010-05-12 21:35:42

标签: bash file shell date

应用程序每天都会创建一个名为file_YYYYMMDD.csv的文件,其中YYYYMMDD是生产日期。但有时候生成失败,几天内都没有生成文件。

我想在bash或sh脚本中轻松找到最新文件的文件名,该文件名是在给定的参考日期之前生成的。

典型用法:查找上次生成的文件,忽略5月1日之后生成的文件。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

试试这个:

#!/bin/bash

ls -r | while read fn; do
    date=`echo $fn | sed -e 's/^file_\([0-9]*\)\.csv$/\1/'` || continue
    if [ $date -lt $1 ]; then
        echo $fn
        exit
    fi
done

只需使用您要比较的参考日期调用此脚本即可。如果要包含参考日期,请将-lt替换为-le

编辑:一种替代解决方案,无需管道回显变量。请注意,我没有测试它,但它也应该可以工作。

#!/bin/bash

ls -r | sed -e 's/^file_\([0-9]*\)\.csv$/\1/' | while read date; do
    if [ $date -lt $1 ]; then
        echo "file_${date}.csv"
        exit
    fi
done

答案 1 :(得分:0)

此脚本避免:

  • 循环使用sed
  • Parsing ls
  • while循环
  • 中创建子shell
  • 处理与file_*.csv名称模式
  • 不匹配的文件

这是脚本:

#!/bin/bash
while read -r file
do
    date=${file#*_}    # strip off everything up to and including the underscore
    date=${date%.*}    # strip off the dot and everything after
    if [[ $date < $1 ]]
    then
        break
    fi
done < <(find -name "file_*.csv" | sort -r)

# do something with $file, such as:
echo "$file"

修改

使用Bash&gt; = 3.2,您可以使用正则表达式执行此操作:

#!/bin/bash
regex='file_([[:digit:]]+).csv'
while read -r file
do
    [[ $file =~ $regex ]]
    date=${BASH_REMATCH[1]}
    if [[ $date < $1 ]]
    then
        break
    fi
done < <(find -name "file_*.csv" | sort -r)

# do something with $file, such as:
echo "$file"

答案 2 :(得分:0)

如果文件名中有换行符,则使用man 1 sort对文件名进行排序将失败。

相反,我们应该使用类似的东西:

touch $'filename\nwith\777pesky\177chars.txt'  # create a test file

ls -1db * 

find ... -print0 | LC_ALL=C sort0 ... 

请参阅:

在子目录中查找所有已使用的扩展名

http://codesnippets.joyent.com/posts/show/2300