将当前日期从变量追加到文件名


55

我正在尝试将当前日期附加到文件名的末尾,如下所示:

TheFile.log.2012-02-11

这是我到目前为止的内容:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

但是,我得到的只是文件的名称,它不附加任何内容。如何将当前日期附加到文件名?


当您指定日期时,请确保不使用日期,:因为这将在rsync和scp中将其作为主机读取。stackoverflow.com/a/37143274/390066
kirill_igum '16

Answers:


78

您使用的可能性更大set。这会将'today','='和date程序输出分配给位置参数(也就是命令行参数)。您只想使用C shell(您将其标记为“ bash”,所以可能不会),您将需要使用:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

注意等号周围缺少空格。

您也不想&在语句末尾使用。这会导致外壳不等待命令完成。尤其是当一个依靠下一个时。该find命令可能会失败,因为它是在之前启动的mkdir


感谢那个伙伴,现在它的工作已被罚款100%,为平视和mkdir欢呼
我是

55

Bash脚本将日期注入文件名:

文件中的此bash代码称为 a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

运行时,打印:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

代码说明:

用/ bin / bash解释器解释脚本。新建一个今天的变量。执行date命令,并传入Y,m,d,H,M,S标志以配置输出。将结果放入date变量。

创建一个名为filename的新变量,将$ today变量与其余的静态文件名文本一起包围。然后将文件名回显到屏幕。

将其塞成单线以增加lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

您似乎混淆了几件事。

set today = 'date +%Y'看起来像tcsh语法,但是即使在tcsh中,它也会将字符串分配date +%Y给变量today,但不会运行date命令。由于您可能正在使用bash或其他POSIX shell,因此赋值的语法为today=some_value(等号周围没有空格)。要运行命令并将其输出分配给变量,请使用命令替换

today=$(date +%Y-%m-%d)

(我还完成了日期说明)。您可以使用反引号而不是美元括号,但是在视觉上容易将其与正引号引起混淆,并且当需要在反引号中使用引号时,规则非常复杂且依赖于实现,因此最好不要坚持使用$(…)(使用更精简的语法具有相同的效果)。

&在几个命令的末尾使用了。这使得命令在后台执行,这里不需要。我怀疑您的意思是&&,这意味着只有第一个命令成功执行下一个命令。

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

&&在每个命令之后使用的替代方法是使用来启动脚本set -e。这告诉外壳程序在任何命令返回非零状态后立即停止执行脚本(if条件和其他情况下的命令除外)。

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

您的find命令很好,但是可能不会执行您打算做的事情(尽管我不确定这是什么)。

您要使用创建目录,mkdir然后立即使用遍历该目录find。除非目录已经存在,否则它将不会有用。您是要为今天的日志创建目录,还是将最近的文件从The_Logs目录移动到例如eg的目录The_Logs.2012-02-11

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

还是您要重命名今天的日志文件以添加后缀$today?这需要为每个要移动的文件计算不同的文件名。

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

请注意,我使用-mtime,是根据文件的修改时间来移动文件,而不是-atime,这是上次读取文件的时间(如果您的系统跟踪该文件的时间,如果不是,则该时间可能早于文件的修改时间)。mtime)。



2

这个:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

应该管用。虽然,似乎您使用的是csh,但是我删除+符号的解决方案可能对您不起作用,但尝试使用它不会造成伤害。将变量括在{}大括号内,始终是防止意外变量扩展的好主意。


谢谢队友,在加上其他答案的修正后,它的工作正常。
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.