【发布时间】:2019-01-30 13:45:06
【问题描述】:
我正在编写一个批处理程序来删除目录中的所有文件,文件名中有条件。
目录中有大量文本文件(约数十万个文件),文件名固定为“abc”+日期
abc_20180820.txt
abc_20180821.txt
abc_20180822.txt
abc_20180823.txt
abc_20180824.txt
程序尝试grep所有文件,将日期与固定日期进行比较,如果文件名的日期
我的问题:有没有办法在运行 ls 命令时比较日期?不获取列表中的所有文件然后比较删除,而是仅列出已经满足条件的文件然后删除。我认为这样会有更好的表现。
我的代码是
TARGET_DATE = "5-12"
DEL_DATE = "20180823"
ls -t | grep "[0-9]\{8\}".txt\$ > ${LIST}
for EACH_FILE in `cat ${LIST}` ;
do
DATE=`echo ${EACH_FILE} | cut -c${TARGET_DATE }`
COMPARE=`expr "${DATE}" \< "${DEL_DATE}"`
if [ $COMPARE -eq 1 ] ;
then
rm -f ${EACH_FILE}
fi
done
发现了一些类似的问题,但我不知道如何完成 List file using ls with a condition and process/grep files that only whitespaces
【问题讨论】:
-
它必须是您使用的文件名还是您可以稍微模糊一点并使用文件的修改、访问或更改时间?如果是这样,您可以将
find与delete选项一起使用。find . -type f -name '*.txt' -mtime +30 -print -delete之类的东西,其中 +30 是 30 天或更早 -
不幸的是,find 命令仍然需要相当长的时间。无论如何,感谢您的解决方案。