Bash Script将文件重命名为修改后的日期并添加后缀


| Filename | DateModified | After Rename |
| --- | --- | --- |
| aaa.mp3 | 20230114 | 20230114_1.mp3 |
| bbb.mp3 | 20230113 | 20230113_1.mp3 |
| ccc.mp3 | 20230114 | 20230114_2.mp3 |
| ddd.mp3 | 20221205 | 20221205_1.mp3 |
| eee.mp3 | 20230113 | 20230113_2.mp3 |

我有一个文件夹"/volume1/music/">


我想把文件重命名为修改日期,并添加inase后缀以避免同名。我使用下面的代码,但不知道如何处理计数器后缀

cd "/volume1/music/"
counter=1
for file in *.mp3; do
cdate=$(date -r "$file" +"%Y%m%d")
echo "$cdate"
if [ -f "$cdate" ]; then
set counter=counter+1
else 
set counter=0
fi
echo mv "$file" "$cdate"_"$counter"
done

谢谢你的帮助!

只需将计数器初始化移到循环中,并通过反复测试是否存在全名而不仅仅是日期字符串来递增。

您可以添加一个测试来避免重命名已经具有正确名称格式的文件。

cd "/volume1/music/"
for oldfile in *.mp3; do
cdate=$(date -r "$oldfile" +"%Y%m%d")
echo "$cdate"
if [[ $oldfile =~ ^[0-9]{8}_[0-9]{1,}.mp3$ ]]; then
if [[ $oldfile =~ ^"$cdate" ]]; then
echo "skipping $oldfile"
continue
fi
fi
counter=1
while
newfile="${cdate}_${counter}.mp3"
[ -e "$newfile" ]
do
(( counter++ ))
done
echo mv "$oldfile" "$newfile"
done

我使用下面的代码,但不知道如何处理计数器后缀

像这样:

#!/usr/bin/env bash
cd /volume1/music/ || exit
shopt -s nullglob extglob
for file in ./!([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9]*).mp3; do
counter=1
ext="${file##*.}"
cdate=$(date -r "$file" +"%Y%m%d") || exit
if [[ -n "$cdate" ]]; then
echo "$cdate"
while [[ -e "$cdate"_"$counter"."$ext" ]]; do
((counter++))
done
echo mv -vn "$file" "$cdate"_"$counter"."$ext" || exit
fi
done

  • 如果您认为输出正常,请删除echo

最新更新