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


82

好吧,我是linux新手,我在使用简单的bash脚本时遇到了问题。

我有一个程序可以在运行时添加到日志文件中。随着时间的流逝,该日志文件将变得越来越大。我想创建一个启动脚本,该脚本将在每次运行之前重命名并移动日志文件,从而为程序的每次运行有效地创建单独的日志文件。到目前为止,这是我得到的:

糊盒

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

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

: command not found
program

当我CD到logs目录并运行dir时,我看到以下内容:

201111211437\r.log\r

这是怎么回事?我假设我缺少一些语法问题,但似乎无法弄清楚。


更新:由于下面的Shellter评论,我发现问题是由于我正在Windows的Notepad ++中编辑.sh文件,然后通过ftp发送到服务器,然后通过ssh运行文件。在文件上运行dos2unix后,它可以工作。

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


2
\r
carry_return

那辆马车从哪里来?我猜大概logs/$DATE.log是有问题的,但是输入会echo logs/$DATE.log输出正确的路径。
Cat5InTheCradle,2011年

我怎么会知道?请附上对应的bash脚本,可能有不引人注意whitepspaces
ajreal

在主帖子中添加了一个pastebin链接,但是该代码段实际上是整个脚本,我刚刚用“ echo program”替换了启动java .jar的行
Cat5InTheCradle

不知道...似乎是正确的,您如何尝试在DATE=$(date +"%Y%m%d%H%M")?之后追加一些字符串?
2011年

Answers:


24

您从脚本中发布的几行对我来说还不错。它可能更深一些。

您需要找到哪条线给您这个错误。添加set -xv到脚本的顶部。这将打印出行号和正在执行到STDERR的命令。这将帮助您确定在脚本中哪里出现此特定错误。

顺便说一句,您的脚本顶部有一个shebang吗?当我看到这样的消息时,通常我希望它与Shebang有关。例如,如果您#! /bin/bash位于顶部,但bash解释器位于中/usr/bin/bash,则会看到此错误。

编辑

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

两种方式:

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

我看看是否可以尝试。一旦将文件通过ftp传输到我的linux服务器上,即可运行dos2unix解决了该问题,但是我正在寻找解决该额外步骤的方法。一开始我没有shebang,这可能是关键。
Cat5InTheCradle 2011年

1
@AgentSnazz-啊哈!那就是问题所在。Unix shell脚本必须具有Unix行尾。Windows / MS-DOS使用回车换行符(也称为CRLF或\ r \ n)来标记该行的结尾。Unix仅使用换行符(又名LF或\ n)。如果要在Windows计算机上为Unix编辑文件,则必须使用能够正确行尾的程序编辑器(例如VimNotepad ++切勿使用Notepad。这就是为什么\r在文件名中看到的原因。\r程序每一行的末尾都有一个不可见的区域
David W.

79
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

16
date +"%Y%m%d%H%M"如果您的重击动作有所不同
2014年

6
要强调@zinking的观点,加号和双引号之间不能有空格
puk

9

bash中的单行方法是这样的。

[部分输出]> $(日期“ +%Y.%m。%d-%H.%M.%S”)。ver

将创建一个带有ver扩展名的时间戳名称的文件。如下所示将工作快照列出日期戳文件名的工作文件可以表明其工作正常。

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

当然

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

甚至更简单

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver


5

我使用此命令来简单地旋转文件:

mv output.log `date +%F`-output.log

在本地文件夹中 2019-09-25-output.log



1

您可以在记事本中编写脚本,但只需确保使用-> $ sed -i's / \ r $ //'在此处将其转换即可

当我在Cygwin工作时,我会一直使用它,并且它可以正常工作。希望这可以帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.