自下而上反向交换文件夹中文件的文件名

自下而上反向交换文件夹中文件的文件名

我在某个文件夹中有一些 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文件夹。

相关内容