背景
根据与另一组文件相对应的名称重命名一组文件,并使用基于文件大小的排序顺序来匹配文件名。两组中的文件大小大致相同。足够接近,以至于按文件大小排序时,两个列表的顺序相同。每组中的文件数量完全相同。
问题
第一个文件集:
master~$ for f in $(ls -S); do echo $f; done
06-AudioTrack_06.flac
08-AudioTrack_08.flac
01-AudioTrack_01.flac
05-AudioTrack_05.flac
02-AudioTrack_02.flac
第二组文件:
corrupt~$ for f in $(ls -S); do echo $f; done
Groove_de_V..flac
Jump.flac
Do_You_Savvy.flac
Gershwins_Blues.flac
Blue_Skies.flac
If_I_Had_A_Ribbon_Bow.flac
问题
如何重命名第一组,如下所示:
06-Groove_de_V..flac
08-Jump.flac
01-Do_You_Savvy.flac
05-Gershwins_Blues.flac
02-Blue_Skies.flac
脚本
迄今为止...
master~$ for f in $(ls -S); do
IDX=$(echo $f | awk '{print substr( $1, 1, 2 )}');
echo "mv $i $IDX-";
done
生成:
mv 06-AudioTrack_06.flac 06-
mv 08-AudioTrack_08.flac 08-
mv 01-AudioTrack_01.flac 01-
mv 05-AudioTrack_05.flac 05-
mv 02-AudioTrack_02.flac 02-
谢谢你!
答案1
对脚本进行一些修改,消除了对 AWK 的需求并简化了索引变量的递增。它现在还可以正确处理包含空格的文件名。
#!/bin/bash
index=0
# Store the names of original (corrupt) files
while read -r f
do
corrupt[index++]=${f##*/}
done < <(ls -S "$1"/*.flac)
index=0
while read -r f
do
idx=${f:0:2}
original=${corrupt[index++]}
echo mv "$f" "$idx-$original"
done < <(ls -S *.flac)