重命名多个文件并在文件前添加日期

重命名多个文件并在文件前添加日期

我有一个文件夹包含一个或多个 tar.gz 文件。我想在脚本运行时在每个文件之前添加当前日期。

例如:

两个文件名(这些文件每天都会创建,但名称保持不变):

file1.tar.gz 
file2.tar.gz

在第一天(2011-10-07),这两个文件将被重命名为:

2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz

次日(2011-10-08)更改为:

2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz

最后,该文件夹包含以下文件:

2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz
2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz

如何用一根线来实现这一点?我尝试使用“重命名”命令,但我只能在文件后面添加日期,而不能在文件之前添加日期。

我的代码

cdate=`date +"%Y-%m-%d"`; rename .gz .gz.$cdate *.gz

答案1

显然,关键是避免重命名已经具有日期前缀的文件。

cdate=$(date +"%Y-%m-%d")
shopt -s extglob
for file in !([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.gz); do
  mv "$file" "${cdate}_$file"
done

答案2

您的示例代码可能会给您带来类似的结果file1.2011-10-07.2011-10-08.tar.gz,我怀疑这就是您想要的。

此外,rename这不是一个标准命令,因此它实际上取决于您的用途。

既然您说只有固定数量的具有固定名称的文件,您可能可以使用一个简单的脚本,例如:

cdate=$(date +%Y-%m-%d)
for file in file1.tar.gz file2.tar.gz; do
    mv "$file" "$cdate"_"$file"
done

答案3

假设文件名称中永远不会包含下划线,一个简单的 bash 4+ 解决方案是使用外部全局变量:

shopt -s extglob
today=$(date +%F)
for f in ./!(*_*).tar.gz; do mv "$f" "$today"_"$f"; done

更强大的版本:

shopt -s extglob
today=$(date +%F)
for f in ./!(????-??-??_*).tar.gz; do mv "$f" "$today"_"$f"; done

答案4

您无需使用 bashism(循环和/或 extglob 模式)即可完成此操作,只需使用 find、cut、grep 和 xargs。

find . -maxdepth 1 -type f | \
    cut -c3- | \
    grep -v '^\.' | \
    grep -v '^[0-9][0-9][0-9][0-9]\-[0-9][0-9]-[0-9][0-9]_' | \
    xargs -n 1 -I {} echo mv "{}" "`date +"%Y-%m-%d"`_{}"

删除 来echo应用更改,而不仅仅是打印 mv 命令。

相关内容