应用程序每天都会创建一个名为file_YYYYMMDD.csv
的文件,其中YYYYMMDD
是生产日期。但有时候生成失败,几天内都没有生成文件。
我想在bash或sh脚本中轻松找到最新文件的文件名,该文件名是在给定的参考日期之前生成的。
典型用法:查找上次生成的文件,忽略5月1日之后生成的文件。
感谢您的帮助
答案 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
ls
while
循环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 ...
请参阅:
在子目录中查找所有已使用的扩展名