我有一个文件夹包含一个或多个 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 命令。