Linux 在BASH中使用mv向文件名添加时间戳
嗯,我是linux新手,我对简单的bash脚本有一个问题 我有一个程序,在日志文件运行时添加到日志文件中。随着时间的推移,日志文件变得越来越大。我想创建一个启动脚本,它将在每次运行之前重命名和移动日志文件,有效地为程序的每次运行创建单独的日志文件。以下是到目前为止我得到的信息: 运行时,我看到以下内容:Linux 在BASH中使用mv向文件名添加时间戳,linux,bash,Linux,Bash,嗯,我是linux新手,我对简单的bash脚本有一个问题 我有一个程序,在日志文件运行时添加到日志文件中。随着时间的推移,日志文件变得越来越大。我想创建一个启动脚本,它将在每次运行之前重命名和移动日志文件,有效地为程序的每次运行创建单独的日志文件。以下是到目前为止我得到的信息: 运行时,我看到以下内容: : command not found program 201111211437\r.log\r 当我cd到logs目录并运行dir时,我看到: : command not found p
: command not found
program
201111211437\r.log\r
当我cd到logs目录并运行dir时,我看到:
: command not found
program
201111211437\r.log\r
发生什么事了?我假设我遗漏了一些语法问题,但我似乎无法理解
更新:感谢Shelleter在下面的评论,我发现问题是由于我在windows的Notepad++中编辑.sh文件,然后通过ftp发送到服务器,在那里我通过ssh运行该文件。在文件上运行dos2unix之后,它就可以工作了
新问题:首先,如何正确保存文件,以避免每次重新发送文件时都必须执行此修复?好吧,这不是对您问题的直接回答,但GNU/Linux中有一个工具,其任务是定期旋转日志文件,将旧文件压缩到一定的限制。这是
logrotate
我觉得你从脚本中发布的几行内容还不错。可能是更深一点的原因
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
你需要找出哪一行给你这个错误。将set-xv
添加到脚本顶部。这将打印出行号和正在执行到STDERR的命令。这将帮助您确定在脚本的何处出现此特定错误
顺便说一句,你的剧本顶部有一个字母吗?当我看到这样的事情时,我通常认为这是一个与Shebang有关的问题。例如,如果您有#/bin/bash
位于顶部,但是您的bash解释器位于/usr/bin/bash
中,您将看到此错误
编辑
新问题:首先,如何正确保存文件,以避免每次重新发送文件时都必须执行此修复
两种方式:
您可以在记事本中编写脚本,但只需确保将其转换即可 使用此-> $sed-i's/\r$/'您的脚本在此处
当我在cygwin工作的时候,我一直在用它,而且很有效。希望这有帮助bash中的单行方法是这样工作的 [某些输出]>$(日期“+%Y.%m.%d-%H.%m.%S”).ver 将创建一个具有时间戳名称和版本扩展名的文件。 列出日期戳文件名的快照的工作文件(如下所示)可以显示它正在工作
find-类型f-exec ls-la{}\|切割-d'-f 6->$(日期“+%Y.%m.%d-%H.%m.%S”).ver
当然
cat somefile.log>$(日期“+%Y.%m.%d-%H.%m.%S”).ver
甚至更简单
ls>$(日期“+%Y.%m.%d-%H.%m.%S”).ver
我使用此命令简单地旋转文件:
mv output.log `date +%F`-output.log
在本地文件夹中,我有
2019-09-25-output.log
首先,感谢上面的答案!它们导致了我的解决方案
我已将此别名添加到.bashrc文件中:
alias now='date +%Y-%m-%d-%H.%M.%S'
现在,当我想在文件(如构建日志)上设置时间戳时,我可以这样做:
mvn clean install | tee build-$(now).log
我得到的文件名如下:
build-2021-02-04-03.12.12.log
\r
是回车,检查一下bash脚本,可能包含在脚本中,回车从哪里来?我猜关于logs/$DATE.log
的某些内容是错误的,但是键入echo logs/$DATE.log
会输出正确的路径。我怎么知道?请附上相应的bash脚本,可能有不可见的WhitePSpace添加了一个到主帖子的pastebin链接,但该代码片段实际上就是整个脚本,我只是用“echo程序”替换了启动java的行。jarno不知道。。。似乎是正确的,在日期=$(日期+%Y%m%d%H%m”)
之后尝试附加一些字符串怎么样?我会看看,我喜欢我的方法,因为它很好地将程序的每次运行包装在自己的日志文件中。我会看看是否可以尝试。一旦文件通过ftp传输到我的linux服务器上,运行dos2unix就可以解决这个问题,但我正在寻找一种绕过这一额外步骤的方法。我一开始并没有射箭,这可能是关键。@Agentsnaz-啊哈!这就是问题所在。Unix shell脚本必须具有Unix行结尾。Windows/MS-DOS使用回车换行符(也称为CRLF或\r\n)来标记行的结尾。Unix只使用换行符(也称为LF或\n)。如果您在Windows计算机上为Unix编辑文件,则必须使用能够生成正确行结尾的程序编辑器(如或。切勿使用记事本。这就是为什么您在文件名中看到\r
。在程序的每一行末尾都有一个不可见的\r
。日期+%Y%m%d%H%m”
如果您的bash与强调@zinking的要点略有不同,则加号和双引号之间不得有空格