와 같은 파일이 포함된 폴더가 있습니다 /User/me/Desktop/folder/images
. 내 웹사이트로 가져올 때 파일이 잘못 정렬되어 문자 우선순위에 따른 정렬이 아닌 것처럼 보이는 배열이 표시됩니다. 따라서 순서가 올바르도록 3자리가 아닌 모든 이미지 이름을 0으로 채워진 3자리의 해당 이름으로 바꾸고 싶습니다. Mac 터미널의 한 줄에 파일이 가득한 폴더에서 이 작업을 어떻게 수행합니까?key 1--name.jpg
key 10--name1.jpg
key 84--name.jpg -> key 9--name.jpg -> key 94--name.jpg
key 9--name.jpg -> key 84--name.jpg -> key 94--name.jpg
9, 12, 99
009, 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