好吧,我是一个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后,它就可以运行。
新问题:如何首先正确保存文件,以避免每次重新发送文件时都必须执行此修复?
答案 0 :(得分:59)
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
答案 1 :(得分:22)
您从脚本中发布的几行看起来不错。它可能更深一点。
您需要找到哪条线路给您这个错误。将set -xv
添加到脚本顶部。这将打印出行号和正在执行的命令 STDERR 。这将帮助您确定脚本中的哪个位置会出现此特定错误。
#! /bin/bash
,但您的bash解释程序位于/usr/bin/bash
,则会看到此错误。
新问题:如何首先正确保存文件,以避免每次重新发送文件时都必须执行此修复?
两种方式:
答案 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工作时,我一直用它来运作。希望这有帮助