我在一个文件夹中有一堆文件。其中一些格式为:
IMG_YYYYMMDD_junk.ext
我想将这些文件重命名为
YYYY-MM-DD junk.ext
示例: IMG_20170214_3939233.jpg 变为 2017-02-14 3939233.jpg
到目前为止,我成功地过滤了我需要的文件:
找到* .jpg * .jpeg * .png | egrep'^ IMG_ [0-9] {1,8}'
我知道我需要使用sed但是我没有在我的正则表达式中指定和引用匹配组以进行进一步的文件名转换。我知道我可能不得不在管道中使用xarg,但到目前为止我还没有成功转换每个文件名只是为了打印出来。
也许,sed不是这里最好的选择。
答案 0 :(得分:2)
使用Perl的独立重命名命令和bash的选项nullglob:
rdbuf()
如果一切正常,请删除选项shopt -s nullglob
rename -n 's/.*_(....)(..)(..)_([0-9]+.*)/$1-$2-$3 $4/' *.jpg *.jpeg *.png
。
答案 1 :(得分:1)
bash
中带有 NO 外部工具的逻辑!
您可以从包含这些图像的文件夹中运行以下脚本。
#!/bin/bash
for file in *.{jpg,jpeg,png}; do
IFS="_" read -ra fileNameList <<<"$file"
year="${fileNameList[1]:0:4}"
month="${fileNameList[1]:4:2}"
day="${fileNameList[1]:6:2}"
targetFileName="${year}-${month}-${day} ${fileNameList[2]}"
# Remove this line and uncomment the line with 'mv' if things look OK
echo "$file" "$targetFileName"
#mv -v "$file" "$targetFileName"
done
这个想法是在_
上拆分文件名并将它们存储在数组中。然后解析数字中的各个数字,并从组合元素中形成最终名称。
答案 2 :(得分:1)
使用GNU Parallel,它看起来像这样:
find *.jpg *.jpeg *.png |
parallel mv {} '{= s/IMG_(....)(..)(..)_/$1-$2-$3 / =}'
或者:
parallel mv {} '{= s/IMG_(....)(..)(..)_/$1-$2-$3 / =}' ::: *.jpg *.jpeg *.png
答案 3 :(得分:0)
我认为您对find命令并不感兴趣,但确定了sed
正则表达式:
find ~ -type f -maxdepth 1 -name IMG*.jpg | sed -e 's/\(IMG_\)\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)_/\2-\3-\4 /g'
你的例子:
echo "IMG_20170214_3939233.jpg" | sed -e 's/\(IMG_\)\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)_/\2-\3-\4 /g'
输出:
2017-02-14 3939233.jpg
答案 4 :(得分:0)
主要是使用其正则表达式匹配运算符bash
的{{1}}解决方案,该运算符支持可通过内置=~
数组变量访问的捕获组:
"${BASH_REMATCH[@]}"