Linux 在BASH中使用mv向文件名添加时间戳

Linux 在BASH中使用mv向文件名添加时间戳,linux,bash,Linux,Bash,嗯,我是linux新手,我对简单的bash脚本有一个问题 我有一个程序,在日志文件运行时添加到日志文件中。随着时间的推移,日志文件变得越来越大。我想创建一个启动脚本,它将在每次运行之前重命名和移动日志文件,有效地为程序的每次运行创建单独的日志文件。以下是到目前为止我得到的信息: 运行时,我看到以下内容: : command not found program 201111211437\r.log\r 当我cd到logs目录并运行dir时,我看到: : command not found p

嗯,我是linux新手,我对简单的bash脚本有一个问题

我有一个程序,在日志文件运行时添加到日志文件中。随着时间的推移,日志文件变得越来越大。我想创建一个启动脚本,它将在每次运行之前重命名和移动日志文件,有效地为程序的每次运行创建单独的日志文件。以下是到目前为止我得到的信息:

运行时,我看到以下内容:

: 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
中,您将看到此错误

编辑 新问题:首先,如何正确保存文件,以避免每次重新发送文件时都必须执行此修复

两种方式:

  • 编辑文件时,选择编辑->下线转换->Unix格式菜单项。一旦有了正确的行尾,记事本++将保留它们
  • 要确保所有新文件都有正确的行尾,请转到“设置->首选项”菜单项,然后拉出“首选项”对话框。选择“新建文档/默认目录”选项卡。在“新建文档和格式”下,选择Unix单选按钮。单击关闭按钮

  • 您可以在记事本中编写脚本,但只需确保将其转换即可 使用此-> $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的要点略有不同,则加号和双引号之间不得有空格