我有一个文件夹,其中包含、等/User/me/Desktop/folder/images
文件。这些文件在输入到我的网站时排序不正确,因此由于字符优先级,我得到的排列是像而不是。因此,我想将所有非三位数长度的图像名称替换为三位数、0 填充的等效名称,以便顺序正确。如何在 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 \
。无论如何,如果文件已经存在(-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