我在某个文件夹中有一些 jpg 文件:
hg_test_spr.jpg
hg_test00001.jpg
hg_test00002.jpg
hg_test00003.jpg
hg_test00004.jpg
hg_test00005.jpg
hg_test00006.jpg
.
.
.
hg_test01200.jpg
我想以相反的顺序重命名文件,以便第一个文件的名称将与最后一个文件交换,第二个文件与倒数第二个文件交换,依此类推。
换句话说:
hg_test_spr.jpg --> DO NOT RENAME THIS
hg_test00001.jpg --> hg_test01200.jpg
hg_test00002.jpg --> hg_test01199.jpg
hg_test00003.jpg --> hg_test01198.jpg
hg_test00004.jpg --> hg_test01197.jpg
hg_test00005.jpg --> hg_test01196.jpg
hg_test00006.jpg --> hg_test01195.jpg
.
.
.
hg_test01199.jpg --> hg_test00002.jpg
hg_test01200.jpg --> hg_test00001.jpg
我可以通过这种方式以相反的顺序获取文件列表:
ls *.bmp | tac | tee reverse_order.txt
或者也许更好的是:
ls *hg_test0*.bmp | tac | tee reverse_order.txt
然后也许是这样的:
mkdir renamed
for file in *hg_test0*.bmp; do read line; cp -v "${file}" "renamed/${line}"; done < reverse_order.txt
做这个的最好方式是什么?
答案1
根据您用 5 位数字表示的文件的数字顺序,您可以使用 shell 的 glob 功能来根据您的需要进行重命名
shopt -s nullglob
fileList=(hg_test[0-9]*)
count="${#fileList[@]}"
for file in hg_test[0-9]*; do
echo "$file" "hg_test$(printf "%05d" "$count").jpg"
((count--))
done
这基本上将是echo
实际文件名与替换的文件名。一旦发现名称按预期完好无损,请删除echo
并使用该mv
命令。
答案2
假设hg_*[0-9].jpg
以正确的“前进”顺序扩展到您想要重命名的所有文件,并且您希望将重命名的文件写入子目录renamed
。
使用bash
:
mkdir renamed || exit 1 # fail if this directory exists
names=( hg_*[0-9].jpg )
for (( i=0; i < "${#names[@]}"; ++i )); do
cp "${names[i]}" renamed/"${names[-(i+1)]}"
done
这首先生成保存在数组中的文件名列表names
。该循环遍历生成的名称列表,并在距列表末尾一定的偏移量处为每个文件选择一个新名称。现有文件不会被修改,并且具有新名称的副本将写入该renamed
文件夹。