我有很多文件的文件名不一致。
例如
IMG_20200823_1.jpg
IMG_20200823_10.jpg
IMG_20200823_12.jpg
IMG_20200823_9.jpg
我想重命名所有它们,并确保它们都遵循相同的命名约定
IMG_20200823_0001.jpg
IMG_20200823_0010.jpg
IMG_20200823_0012.jpg
IMG_20200823_0009.jpg
发现使用以下可以更改只有一个编号的文件
printf "%04dn"
然而,我无法处理我的文件,因为它们混合了字符串+"_"+不同的数字。
有人能帮我吗?谢谢
使用Perl的独立rename
或prename
命令:
rename -n 's/(d+)(.jpg$)/sprintf("%04d%s",$1,$2)/e' *.jpg
输出:
重命名(IMG_20200823_10.jpg,IMG_20208-23_0010.jpg(重命名(IMG_20200823_12.jpg,IMG_20208-23_0012.jpg(重命名(IMG_20200823_1.jpg,IMG_20208-23_0001.jpg(重命名(IMG_20200823_9.jpg,IMG_20208-23_0009.jpg(
如果一切正常,请删除-n
。
使用Bash正则表达式:
re='(IMG_[[:digit:]]+)_([[:digit:]]+)'
for f in *.jpg; do
[[ $f =~ $re ]]
mv "$f" "$(printf '%s_%04d.jpg' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}")"
done
其中CCD_ 4是包含正则表达式的捕获组的阵列。在索引0处是完全匹配;索引1包含CCD_ 5和第一组数字;索引2包含第二组数字。printf
命令用于用四位数宽的零填充来格式化第二组。
使用正则表达式从输入中提取相关的子字符串,然后填充…
- 对于每个文件
- 从文件名中提取前缀、数字和后缀
- 用零填充数字
- 创建新的文件名
- 移动文件
bash的以下代码:
echo 'IMG_20200823_1.jpg
IMG_20200823_10.jpg
IMG_20200823_12.jpg
IMG_20200823_9.jpg' |
while IFS= read -r file; do # foreach file
# Use GNU sed to extract parts on separate lines
tmp=$(<<<"$file" sed 's/(.*_)([0-9]*)(..*)/1n2n3n/')
# Read the separate parts separated by newlines
{
IFS= read -r prefix
IFS= read -r number
IFS= read -r suffix
} <<<"$tmp"
# create new filename
newfilename="$prefix$(printf "%04d" "$number")$suffix"
# move the files
echo mv "$file" "$newfilename"
done
输出:
mv IMG_20200823_1.jpg IMG_20200823_0001.jpg
mv IMG_20200823_10.jpg IMG_20200823_0010.jpg
mv IMG_20200823_12.jpg IMG_20200823_0012.jpg
mv IMG_20200823_9.jpg IMG_20200823_0009.jpg
对您在printf中的提示感到困惑。。。
当前文件夹内容:
$ ls -1 IMG_*
IMG_20200823_1.jpg
IMG_20200823_21.jpg
当然不是一个好的解决方案,但有了printf和sed,我们可以做到:
$ printf "mv %3s_%8s_%d.%3s %3s_%8s_%04d.%3sn" $(ls -1 IMG_* IMG_* | sed 's/_/ /g; s/./ /')
mv IMG_20200823_1.jpg IMG_20200823_0001.jpg
mv IMG_20200823_21.jpg IMG_20200823_0021.jpg