linux Bash脚本将文件重命名为修改日期并添加后缀

rqqzpn5f  于 2023-01-16  发布在  Linux
关注(0)|答案(2)|浏览(258)
| 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/",里面有多个随机命名的MP3文件。
我想将文件重命名为修改日期,并添加递增后缀以避免同名。
我使用了下面的代码,但不知道如何处理counter后缀

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

谢谢你的帮助!

hwamh0ep

hwamh0ep1#

只需将计数器初始化移到循环内部,并通过反复测试全名而不仅仅是日期字符串的存在来递增。
可以添加测试以避免重命名已经具有正确名称格式的文件。

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
ygya80vv

ygya80vv2#

我使用了下面的代码,但不知道如何处理counter后缀
大概是这样的

#!/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

相关问题