如何在图像名称中包含的数字前面添加适当数量的 0?

如何在图像名称中包含的数字前面添加适当数量的 0?

我有一个文件夹,其中包含、等/User/me/Desktop/folder/images文件。这些文件在输入到我的网站时排序不正确,因此由于字符优先级,我得到的排列是像而不是。因此,我想将所有非三位数长度的图像名称替换为三位数、0 填充的等效名称,以便顺序正确。如何在 Mac 终端的一行中对充满文件的文件夹执行此操作?key 1--name.jpgkey 10--name1.jpgkey 84--name.jpg -> key 9--name.jpg -> key 94--name.jpgkey 9--name.jpg -> key 84--name.jpg -> key 94--name.jpg9, 12, 99009, 012, 099

答案1

提取数字,例如:

$ echo 'key 88--name.jpg' | sed 's/key \([0-9]\+\)--.*/\1/'
88

使用 printf 格式化它:

$ printf '%04d' "88"
0088

将其重新插入名称中:

$ echo 'key 88--name.jpg' | sed 's/\(key [0-9]\+--\)/key 0088--/'
key 0088--name.jpg

全部在一个脚本中:

#!/bin/sh
for f in 'key '*'--name.jpg'; do
    a="$( echo "$f" | sed 's/key \([0-9]\+\)--.*/\1/' )"
    b="$( printf '%04d' "$a" )"
    c="$( echo "$f" | sed 's/\(key '"$a"'--\)/key '"$b"'--/' )"
    echo \
    mv -i "$f" "$c"
done

或者甚至更快:

#!/bin/sh
for f in 'key '*'--name.jpg'; do
    a="${f#key }"
    a="${a%--name.jpg}"
    b="$( printf 'key %04d--name.jpg' "$a" )"
    echo \
    mv -i "$f" "$b"
done

两个脚本都会不是改变任何事情。他们只会列出将要更改的内容。如果您对所看到的内容感到满意,只需注释掉该行(在前面添加#)即可echo \。无论如何,如果文件已经存在(-i 选项),mv 命令将不会覆盖任何文件。

答案2

如果您事先知道要填充多少位数字,则可以通过结合 shell 的字符串操作和算术功能来相当简单地完成此操作。要填充到 3 位数字,请从 1000 开始编号并去掉前导1.

for current_name in *[0-9]*; do
  # Split the name into prefix, digits, suffix
  prefix=${current_name%%[0-9]*}; suffix=${current_name#"$prefix"}
  # Pad the digits
  digits=${suffix%%[!0-9]*}; suffix=${suffix#"$digits"}
  digits=$((digits+1000)); digits=${digits#1}
  # Rename the file
  new_name="$prefix$digits$suffix"
  if [ "$new_name" != "$current_name" ]; then
    mv -- "$current_name" "$new_name"
  fi
done

答案3

以下函数计算所需的位数(1 表示最多 9 个文件,2 表示最多 99 个文件,aso),并使用文件名中的第一个数字相应地用零填充来重命名文件:

pad_numbers_with_zeros(){
  folder="$1"
  [[ -d "$folder" ]] || { echo 'need directory argument' && return; }
  extension="$2"
  [[ -z "$extension" ]] && extension=wav
  digits="$3"
  if [[ -z "$digits" ]]; then
    amount=$(ls "$folder"/*.$extension | wc -l)
    digits=$(echo "l($amount)/l(10)+1" | bc -l)
  fi
  fmt=$(printf '%%0%dd' $digits)
  for f in "$folder"/*.$extension; do
    bn=$(basename "$f")
    number=$(echo $bn | sed -re 's/^[^[:digit:]]*0*([[:digit:]][[:digit:]]*)[^[:digit:]].*/\1/')
    [[ "$bn" == "$number" ]] && continue
    pf_pat=$(echo $bn | sed -re "s/0*$number/$fmt/")
    new_path=$(printf "$folder/$pf_pat" $number)
    [[ "$f" != "$new_path" ]] &&  mv -i "$f" "$new_path"
  done
}

For .jpg-files 调用带有第二个参数jpg。当然,只有当文件名中包含连续数字时,这才有意义。或者,可以将所需的位数作为第三个参数传递。

答案4

您可以使用合适的过滤器生成排序列表,然后再将它们提供给您的站点,而不是重命名文件。例如:

$ awk -F'[ -]' 'BEGIN{OFS=" "}{$1=$1;print $0}' myfiles | sort -nk2 | sed 's/  /--/'
key 1--name.jpg
key 10--name1.jpg
key 11--name1.jpg
key 32--name1.jpg
key 89--name1.jpg

在哪里

$ cat myfiles 
key 1--name.jpg
key 10--name1.jpg
key 89--name1.jpg
key 32--name1.jpg
key 11--name1.jpg

相关内容