将变量中的当前日期附加到文件名

将变量中的当前日期附加到文件名

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

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" \; &

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

答案1

很可能是您使用了set.这会将“今天”、“=”和程序的输出分配date给位置参数(也称为命令行参数)。您只想使用 C shell(您将其标记为“bash”,所以很可能不会),您将需要使用:

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

请注意等号周围缺少空格。

您也不想&在语句末尾使用;这会导致 shell 不等待命令完成。尤其是当一个人依赖另一个人时。该find命令可能会失败,因为它是在mkdir.

答案2

将日期注入文件名的 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 解释器解释该脚本。创建一个名为“today”的新变量。执行 date 命令,传入 Y、m、d、H、M、S 标志来配置输出。将结果放入日期变量中。

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

将其塞入单线以增加lulz:

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

答案3

你似乎混淆了几件事。

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.这告诉 shell 一旦任何命令返回非零状态就停止执行脚本(除了if条件中的命令和其他一些情况)。

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

你的find命令很好,但可能没有做你想做的事情(尽管我不确定那是什么)。

您正在创建一个目录,mkdir然后立即使用 遍历它find。除非该目录已经存在,否则这没有用。您的意思是为今天的日志创建一个目录并将最近的文件从The_Logs名为 例如 的目录中移动吗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,这是文件上次读取的时间(如果您的系统跟踪该时间 - 如果没有跟踪,则 atime 可能会早到时间)。

答案4

这:

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

应该管用。虽然,您似乎正在使用 csh,而我删除 + 号的解决方案可能对您不起作用,但尝试一下也没什么坏处。将变量括在 {} 大括号中始终是防止意外变量扩展的好主意。

相关内容