在Linux中将日期添加到文件名

76

我想在文件名后添加日期(“somefile.txt”)。例如:somefile_25-11-2009.txt或somefile_25Nov2009.txt或任何类似的格式。

也许可以使用脚本或终端窗口中的一些命令。我正在使用Linux(Ubuntu)。

该脚本或命令应该在每次将文件保存到特定文件夹时更新文件名为新日期,但仍保留以前的文件。因此,最终文件夹中会有以下文件:filename_18Oct2009.txt,filename_9Nov2009.txt,filename_23Nov2009.txt。


14
您可能希望使用yyyy-mm-dd而不是dd-mm-yyyy,以获得文件名的词典排序,并按时间顺序对它们进行排序。 - laalto
7个回答

103

信息/摘要

使用bash脚本,您可以使用反引号或括号将命令封装起来。这对于标记文件非常有用,以下内容将创建一个带有日期附加的文件名。

方法

反引号 -

$ echo myfilename-"`date +"%d-%m-%Y"`"

$(parantheses) - :

$(括号) - :
$ echo myfilename-$(date +"%d-%m-%Y")

使用示例:

echo "Hello World" > "/tmp/hello-$(date +"%d-%m-%Y").txt"

(creates text file '/tmp/hello-28-09-2022.txt' with text inside of it)

请注意,在Linux中引号是你的朋友,在变量中使用空格等字符时最好将文件名放在引号中以避免出现问题。


1
这将日期附加到文件名中 - 在问题示例中,日期需要放在文件名和扩展名之间。 - David Webb
13
这个对我有用:echo test > "data-csv-"\date +"%Y-%m-%d"`".txt"`。 - Michael Butler
3
把这段指令翻译成中文: echo test > "data-csv-"\date +"%Y-%m-%d.txt"`` 意思是将单词“test”写入一个名为“data-csv-年-月-日.txt”的文件中。 - Michael Butler
1
它可能不能完全回答问题,但我花了很长时间才发现如何使用反引号,所以谢谢你。 (正如@MehdiLAMRANI所说,我在不使用双引号的情况下使用它们。) - CJB
1
@CJB,现在我可能更喜欢$(date +"%d-%m-%Y") - miku
显示剩余2条评论

53

这里有两个问题。

1. 将日期作为字符串获取

这很容易。只需使用date命令和+选项即可。我们可以使用反引号将值捕获到变量中。

$ DATE=`date +%d-%m-%y` 

你可以在date手册页面中详细了解使用不同的%选项来更改日期格式。

2. 将文件分割为名称和扩展名。

这有点棘手。如果我们认为文件名中只有一个.,那么我们可以使用cut并指定.作为分隔符。

$ NAME=`echo $FILE | cut -d. -f1
$ EXT=`echo $FILE | cut -d. -f2`

然而,如果文件名中有多个.,这种方法就不起作用了。如果我们使用的是bash(你可能正在使用),我们可以使用一些bash魔法来匹配模式,当我们进行变量扩展时
$ NAME=${FILE%.*}
$ EXT=${FILE#*.} 

将它们放在一起,我们得到:
$ FILE=somefile.txt             
$ NAME=${FILE%.*}
$ EXT=${FILE#*.} 
$ DATE=`date +%d-%m-%y`         
$ NEWFILE=${NAME}_${DATE}.${EXT}
$ echo $NEWFILE                 
somefile_25-11-09.txt                         

如果我们不太关心可读性,可以在一行上完成所有工作(使用不同的日期格式):

$ FILE=somefile.txt  
$ FILE=${FILE%.*}_`date +%d%b%y`.${FILE#*.}
$ echo $FILE                                 
somefile_25Nov09.txt

谢谢Dave,但我应该在哪里运行这个脚本?请原谅我,我对Linux不太熟悉。 - sami
你能详细说明一下你想要做什么吗?所以你有一个在目录中的文件,你想以这种方式给它加上日期戳。是每次都只有一个相同名称的文件,还是可能有多个不同名称的文件呢? - David Webb
我仍然不清楚你想做什么。脚本应该在“每次想将文件保存到特定文件夹时”更新文件名。是什么将文件保存到文件夹中?它来自哪里? - David Webb
如果你想让文件名在每次有人保存某个目录中的内容时都发生更改,那么你需要一些文件系统监视器。看看inotify(man inotify);你应该能够通过这种方式构建一些东西。 - kkeller
非常感谢。这很有帮助。 - Sanket Mehta

26
cp somefile somefile_`date +%d%b%Y`

4
请执行以下命令来对文件进行复制并重命名,新的文件名将包含当前日期,格式为“日-月-年”的缩写:cp somefile somefile_$(date +%d%b%Y) #建议使用 - Amos Folarin

13

你可以使用date命令在子shell中添加日期到文件名后面。

通过在大括号或反引号(`…`)之间调用带有所需格式选项date命令,它将在子shell中执行,然后输出将放置在原始命令中。

$(...)更受欢迎,因为它可以嵌套使用。 因此,您可以在另一个替换中使用命令替换。

问题的解决方案

$ echo somefile_$(date +%d-%m-%Y).txt
somefile_28-10-2021.txt

$ echo somefile_$(date +%d%b%Y).txt
somefile_28Oct2021.txt
< p > date 命令带有许多格式选项,可以根据需求自定义日期输出。

  • %D – 以 mm/dd/yy 的格式显示日期 (例如:10/28/21)
  • %Y – 年份 (例如:2021)
  • %m – 月份 (例如:10)
  • %B – 完整字符串格式的月份名称 (例如:October)
  • %b – 缩短字符串格式的月份名称 (例如:Oct)
  • %d – 月中的某一天 (例如:28)
  • %j – 年中的某一天 (例如:301)
  • %u – 星期几 (例如:4)
  • %A – 完整字符串格式的星期几名称 (例如:Thursday)
  • %a – 缩短字符串格式的星期几名称 (例如:Thu)

5
我在Bash中使用这个脚本:
#!/bin/bash

now=$(date +"%b%d-%Y-%H%M%S")
FILE="$1"
name="${FILE%.*}"
ext="${FILE##*.}"

cp -v $FILE $name-$now.$ext

这个脚本会复制 filename.ext 文件到 filename-date.ext 文件,还有另一个脚本可以将 filename.ext 文件移动到 filename-date.ext 文件,你可以从这里下载这些脚本。 希望它们对你有用!


1
这正是我所需要的,我喜欢带有完整示例的GitHub存储库! - Jaap

4

我在树莓派中使用它,但第一个答案对我无效,可能是因为我输入错误或其他原因?我不知道。因此,我结合了上面的答案,得出了以下结果:

now=$(date +'%Y-%m-%d')
geany "OptionalName-${now}.txt"

如果你想使用Geany或其他工具,可以参考以下图片: enter image description here enter image description here

0
一个有点复杂的解决方案,完全符合您的规格。
echo `expr $FILENAME : '\(.*\)\.[^.]*'`_`date +%d-%m-%y`.`expr $FILENAME : '.*\.\([^.]*\)'`

其中第一个 'expr' 提取不带扩展名的文件名,第二个 'expr' 提取扩展名


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接