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

Cat*_*dle 76 linux bash

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

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

引擎收录

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

运行时,我看到了这个:

: command not found
program
Run Code Online (Sandbox Code Playgroud)

当我cd到logs目录并运行dir时,我看到:

201111211437\r.log\r
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我假设有一些我缺少的语法问题,但我似乎无法弄明白.


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

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

小智 67

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

  • 'date +"%Y%m%d%H%M"`如果你的bash有点不同 (15认同)
  • 要强调@ zinking的观点,必须**不要**加号和双引号之间的空格 (6认同)
  • 我使用 `date +"%Y-%m-%dT%H:%M:%S"` 作为可读的时间戳(秒);它在文件名中包含冒号的 Linux 上运行良好。 (3认同)

Dav*_* W. 24

你从脚本中发布的几行看起来没问题.它可能更深一些.

你需要找到哪一行给你这个错误.添加set -xv到脚本的顶部.这将打印出行号和正在执行的命令给STDERR.这将帮助您确定脚本中您获得此特定错误的位置.

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

编辑

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

两种方式:

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

  • @AgentSnazz - 啊哈!那就是问题所在。Unix shell 脚本必须有 Unix 行结尾。Windows/MS-DOS 使用回车换行(又名 CRLF 或 \r\n)来标记行的结束。Unix 只使用换行符(又名 LF 或 \n)。如果您在 Windows 机器上为 Unix 编辑文件,您必须使用可以执行正确行尾的程序编辑器(如 [Vim](http://www.vim.org) 或 [Notepad++](http:/ /notepad-plus-plus.org/)。**永远不要使用记事本**。这就是你在文件名中看到`\r`的原因。每行末尾都有一个不可见的`\r`在你的程序中。 (2认同)

Cyb*_*nce 8

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


alf*_*ang 6

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

mv output.log `date +%F`-output.log
Run Code Online (Sandbox Code Playgroud)

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


Did*_*set 5

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


cpt*_*lly 5

首先感谢楼上各位的解答!他们导致了我的解决方案。

我将此别名添加到我的 .bashrc 文件中:

alias now='date +%Y-%m-%d-%H.%M.%S'
Run Code Online (Sandbox Code Playgroud)

现在,当我想在文件(例如构建日志)上添加时间戳时,我可以这样做:

mvn clean install | tee build-$(now).log
Run Code Online (Sandbox Code Playgroud)

我得到的文件名如下:

构建-2021-02-04-03.12.12.log