画像名に含まれる数字の前に適切な数のゼロを追加するにはどうすればよいですか?

画像名に含まれる数字の前に適切な数のゼロを追加するにはどうすればよいですか?

などのファイルを含むフォルダがあります/User/me/Desktop/folder/images。私のウェブサイトにインポートすると、ファイルが誤ってソートされ、文字の優先順位によるソートではないように見える配列が表示されます。したがって、順序が正しくなるように、3桁ではなくすべての画像名をゼロで埋められた3桁の対応する名前に変更したいと思います。 Mac端末の1行にファイルがいっぱいのフォルダでこれを行うにはどうすればよいですか?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

1つのスクリプトですべて:

#!/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 \。それにもかかわらず、mvコマンドはファイルがすでに存在する場合、ファイルを上書きしません(-iオプション)。

答え2

埋めたい桁数を事前に知っている場合は、シェルの文字列操作と算術機能を組み合わせて、非常に簡単にこれを行うことができます。 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

次の関数は、必要な桁数(最大9ファイルの場合は1、最大99ファイルの場合は2)を計算し、ファイル名の最初の数字を使用してファイル名を変更し、それに応じてゼロを埋めます。

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は2番目の引数として呼び出されますjpg。もちろん、これはファイル名に連続した数字が含まれている場合にのみ意味があります。あるいは、所望のビット数を第3の引数として渡すことができる。

答え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

関連情報