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

时间:2011-11-22 14:01:46

标签: linux bash

好吧,我是一个linux新手,我遇到了一个简单的bash脚本问题。

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

pastebin

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后,它就可以运行。

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

7 个答案:

答案 0 :(得分:59)

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

答案 1 :(得分:22)

您从脚本中发布的几行看起来不错。它可能更深一点。

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

顺便说一句,你的脚本顶部有shebang吗?当我看到这样的东西时,我通常会认为它与Shebang存在问题。例如,如果您有#! /bin/bash,但您的bash解释程序位于/usr/bin/bash,则会看到此错误。

修改

  

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

两种方式:

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

答案 2 :(得分:6)

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

[some out put]> $(date" +%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

答案 3 :(得分:4)

嗯,这不是你问题的直接答案,但是在GNU / Linux中有一个工具,它的工作是定期轮换日志文件,将旧文件压缩到一定的限制。这是logrotate

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

首先感谢楼上的回答!他们引出了我的解决方案。

我将此别名添加到我的 .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

答案 6 :(得分:0)

您可以在记事本中编写脚本,但只需确保转换它们即可 使用这个 - >  $ sed -i's / \ r $ $'yourscripthere

当我在cygwin工作时,我一直用它来运作。希望这有帮助