我有一个bash脚本,我正在尝试将目录中的所有*.txt文件更改为上次修改日期。这是脚本:
#!/bin/bash
# Renames the .txt files to the date modified
# FROM: foo.txt Created on: 2012-04-18 18:51:44
# TO: 20120418_185144.txt
for i in *.txt
do
mod_date=$(stat --format %y "$i"|awk '{print $1"_"$2}'|cut -f1 -d'.'|sed 's/[: -]//g')
mv "$i" "$mod_date".txt
done
我得到的错误是:
renamer.sh: 6: renamer.sh: Syntax error: word unexpected (expecting "do")
任何帮助将不胜感激。谢谢你的时间。
我总是惊讶地看到人们如何真正聪明地将grep
s通过sed
s到awk
s到cut
s到head
s和tail
s...
在您的特定情况下,您真的很幸运,因为 date
命令可以格式化文件的修改日期(使用 -r
选项)!
因此
#!/bin/bash
# It's a good idea to use one of the two:
shopt -s failglob
# shopt -s nullglob
for i in *.txt; do
mod_date=$(date -r "$i" +'%Y%m%d_%H%M%S')
mv "$i" "$mod_date.txt"
done
应该做这个伎俩。
关于nullglob
或failglob
:如果没有与*.txt
匹配的文件,则脚本只会退出并显示错误(使用 failglob
时),或者,如果使用 nullglob
,则没有任何反应,因为在这种情况下*.txt
扩展到无。
粘贴
的代码不完整。将下面的代码与您的代码进行比较。
#!/bin/bash
# Renames the .txt files to the date modified
# FROM: foo.txt Created on: 2012-04-18 18:51:44
# TO: 20120418_185144.txt
for i in *.txt
do
mod_date=$(stat --format %y "$i"|awk '{print $1"_"$2}'|cut -f1 -d'.' | sed 's/[: -]//g')
mv "$i" "${mod_date}.txt"
done