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