UNIX::填充包含字符串和multipleNumber的文件



我有很多文件的文件名不一致。

例如

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的独立renameprename命令:

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命令用于用四位数宽的零填充来格式化第二组。

使用正则表达式从输入中提取相关的子字符串,然后填充…

  1. 对于每个文件
  2. 从文件名中提取前缀、数字和后缀
  3. 用零填充数字
  4. 创建新的文件名
  5. 移动文件

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

最新更新