使用连续数字重命名文件,保留原始文件名



我得到了一堆带有随机名称和数字的mp3文件,例如:

  • 01_fileabc.mp3
  • 01.文件CDC.mp3
  • FileABC.mp3
  • 929 音频.mp3

出于排序目的,我需要在文件名前面添加一个序列号,例如:

  • 001_01_fileabc.mp3
  • 002_01.文件CDC.mp3
  • 003_fileabc.mp3
  • 004_929-音频.mp3

我检查了我在这里找到的一些解决方案。第一个解决方案之一有点工作,但替换了文件名而不是添加到其中。

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

如何修改此命令以添加到文件名中? 我很抱歉,但无论我尝试什么,我都无法在这里找到解决方案。

只需将${i#*.}(代表"从左到左到第一个点从$i删除")替换为$i,这是文件的原始名称(我可能会使用$filename$oldfile,或者至少$f而不是$i作为变量的名称)。

您也可以将前面的.替换为_,否则文件将被命名

0001.01_fileabc.mp3

等。

更新:正如 RobC 评论此答案时,由于将ls命令与 bash 数组一起使用,现有的空格或换行符可能会导致列出文件的问题。所以上面的代码可以通过这种方式改进

#!/bin/bash
i=0
for file in *.mp3; do
i=$((i+1))
mv "$file" "$(printf "%03d_%s" "$i" "$file")"
done

原始答案:您可以在 bash 脚本中尝试此代码。请记住使其可执行$ chmod +x script.sh.

#!/bin/bash
contents_dir=($(ls *.mp3))
for file in ${!contents_dir[*]}; do
new=$(awk -v i="$file" -v cd="${contents_dir[$file]}" 'BEGIN {printf("%03d_%s", i+1, cd)}')
mv ${contents_dir[$file]} $new
done

它将根据需要将一个连续的 0 引线树数字添加到执行脚本的目录中找到的所有 mp3 文件。

你可以试试这个...

$ ls -l
total 4
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 01.filecdc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 01_fileabc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 929-audio.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 fileabc.mp3
$ t=0
$ for i in *mp3
> do
>     # Use the seq command to get a formatted zero filled string.
>     prefix=$(seq -f "%04g" $t $t)
>
>     # Move $i to new file name.
>     mv $i ${prefix}_${i}
>
>     # Increment our counter, t.
>     t=$(expr $t + 1)
> done

$ ls -l
total 4
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0000_01.filecdc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0001_01_fileabc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0002_929-audio.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0003_fileabc.mp3

最新更新