이미지 이름에 포함된 숫자 앞에 적절한 수의 0을 추가하려면 어떻게 해야 합니까?

이미지 이름에 포함된 숫자 앞에 적절한 수의 0을 추가하려면 어떻게 해야 합니까?

와 같은 파일이 포함된 폴더가 있습니다 /User/me/Desktop/folder/images. 내 웹사이트로 가져올 때 파일이 잘못 정렬되어 문자 우선순위에 따른 정렬이 아닌 것처럼 보이는 배열이 표시됩니다. 따라서 순서가 올바르도록 3자리가 아닌 모든 이미지 이름을 0으로 채워진 3자리의 해당 이름으로 바꾸고 싶습니다. 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 \. 그럼에도 불구하고 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)를 계산하고 파일 이름의 첫 번째 숫자를 사용하여 파일 이름을 바꾸고 그에 따라 0을 채웁니다.

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

관련 정보