Bash 在变量中存储文件名的改进技术?

Bash 在变量中存储文件名的改进技术?,bash,sorting,variables,sed,ls,Bash,Sorting,Variables,Sed,Ls,您好 我需要将日志文件名存储到一个变量中,这样我的脚本就可以对每日日志文件执行一些检查。这些日志总是有不同的名称,因为它们的名称中有时间戳。目前,我使用的是一种hodge podged方法,它通过管道将ls命令传递给sed、sort、cut和tail,以获得名称 CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]

您好

我需要将日志文件名存储到一个变量中,这样我的脚本就可以对每日日志文件执行一些检查。这些日志总是有不同的名称,因为它们的名称中有时间戳。目前,我使用的是一种hodge podged方法,它通过管道将ls命令传递给sed、sort、cut和tail,以获得名称

CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1 )
更新:

$CRON_DATE作为脚本的参数提供。它是创建日志的日期(截止日期)。有时同一天会存在多个日志,所以我希望这是最新的日志

一些典型的文件名:
获取\u cron\u false\u 031810090452.log
获取\u cron\u true\u 031310090001.log
等等

请记住这是按原样工作的。我只是觉得这很难看,我正试图找到一个更好的办法来完成它

我敢肯定我是几个月前从谷歌找到的一些东西拼凑出来的。现在可以了,但我对这项技术不是很满意。我有一些关于如何做得更好的想法,但我以前在这个网站上取得了巨大的成功,我认为最好先参考stackoverflow gods。非常感谢您的回答

谢谢,
Ryan

解析日志文件后,请做一些事情来标记它已被处理,例如重命名它或将其移动到其他文件夹。这样,创建文件的时间就无关紧要了,只是它还没有被解析


我还建议使用更高级的脚本语言。

解析日志文件后,做一些事情来标记它已被处理,例如重命名它或将其移动到其他文件夹。这样,创建文件的时间就无关紧要了,只是它还没有被解析

我还建议使用更高级的脚本语言。

怎么样

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)
编辑:你说得对,bta,我应该抓到的。修复。

怎么样

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1)

编辑:你说得对,bta,我应该抓到的。已修复。

您可以通过在前面加上年份前缀将日期更改为可排序,然后执行以下操作

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)

您可以通过在前面加上年份前缀将日期更改为可排序,然后执行以下操作

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1)
首先,请尝试:

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`
它去掉了
cut
并用
sed
正则表达式交换对
tr
的更可读(IMO)调用。把它分成两行也有助于清晰

如果您在
$LOGS\u DIR
中没有任何其他文件具有极其相似的文件名(如果您将有问题的日志保存在自己的文件夹中,通常会发生这种情况),则可以使用类似于
$LOGS\u DIR/fetch.*.$CRON\u DATE*.log
的简单方法替换
ls
的参数。为了简单起见,不要使该行变得比要求的更复杂,以确保只获取所需的文件。

对于初学者,请尝试:

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log`
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1`
它去掉了
cut
并用
sed
正则表达式交换对
tr
的更可读(IMO)调用。把它分成两行也有助于清晰



如果您在
$LOGS\u DIR
中没有任何其他文件具有极其相似的文件名(如果您将有问题的日志保存在自己的文件夹中,通常会发生这种情况),则可以使用类似于
$LOGS\u DIR/fetch.*.$CRON\u DATE*.log
的简单方法替换
ls
的参数。为了简单起见,不要使该行变得比要求的更复杂,以确保只获取所需的文件。

您需要在此处提供更多输入。典型的文件名是什么?您要获取什么日志文件?什么是
$CRON_DATE
?已更新。谢谢你的留言。我现在就告诉你有什么可以改进的——把它放到一些操作中去。这样做一行代码是以后查看代码并让自己做facepalm的好方法。易读性总是比聪明更重要;0)一些示例文件名将非常有用。另外,如果第一个示例文件名中的$CRON_DATE是“031810”,我建议您改为YYYYMMDD的可排序顺序。你需要在这里提供更多的信息。典型的文件名是什么?您要获取什么日志文件?什么是
$CRON_DATE
?已更新。谢谢你的留言。我现在就告诉你有什么可以改进的——把它放到一些操作中去。这样做一行代码是以后查看代码并让自己做facepalm的好方法。易读性总是比聪明更重要;0)一些示例文件名将非常有用。另外,如果第一个示例文件名中的$CRON_DATE是“031810”,我建议您改为YYYYMMDD的可排序顺序。这将获得最新的日志,但我认为OP希望获得指定日期的最新日志(通过
$CHRON_date
传入)。比我现在做的要干净得多。谢谢数据将获取最新日志,但我认为OP希望获取指定日期的最新日志(通过
$CHRON_date
传入)。比我现在所做的要干净得多。谢谢数据不能按原样工作,因为所有的
“false”
日期都将按字母顺序排列在任何
“true”
日期之前,而不管年份是否带有前缀。您需要另一个步骤来从文本中删除日期。这样做行不通,因为所有的
“false”
日期都将按字母顺序排列在任何
“true”
日期之前,而不管是否以年份为前缀。你需要另一个步骤从文本中删除日期。谢谢Bta。我首先选择了你的,但随后看到了下面的测试版(你帮助修复了),这也很有效。我将使用该解决方案,但感谢您的帮助。谢谢Bta。我首先选择了你的,但随后看到了下面的测试版(你帮助修复了),这也很有效。我将使用这个解决方案,但谢谢你的帮助。这很有趣。。。我喜欢这个陷阱,并将进一步考虑这个问题。谢谢,嗯。这很有趣。。。我喜欢这个陷阱