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

I A*_*M L 69 shell bash date rename

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

TheFile.log.2012-02-11
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所拥有的:

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

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

Arc*_*ege 103

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

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire
Run Code Online (Sandbox Code Playgroud)

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

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


Eri*_*ski 67

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

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

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

运行时,打印:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies
Run Code Online (Sandbox Code Playgroud)

代码说明:

使用 /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"
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 8

你似乎混淆了几件事。

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

today=$(date +%Y-%m-%d)
Run Code Online (Sandbox Code Playgroud)

(我还完成了日期规范)。您可以使用反引号代替美元括号,但它在视觉上很容易与正引号混淆,并且在反引号命令中何时需要引号的规则非常复杂且依赖于实现,因此最好不要坚持$(…)(使用更清晰的语法具有相同的效果)。

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

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find …
Run Code Online (Sandbox Code Playgroud)

&&在每个命令之后使用的替代方法是使用set -e. 这会告诉 shell 在任何命令返回非零状态时立即停止执行脚本(if条件中的命令和其他一些情况除外)。

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find …
Run Code Online (Sandbox Code Playgroud)

你的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" \;
Run Code Online (Sandbox Code Playgroud)

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

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;
Run Code Online (Sandbox Code Playgroud)

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