我得到了一堆带有随机名称和数字的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