Bash:只有一个文件使用 $1 处理,但所有文件都具有硬编码值

Bash: Only one file processed with $1 but all with hard coded value

这个 bash 代码按预期工作(重命名文件),硬编码值即。 ~/Music/*.mp3。但是当我传递 CLI 参数时,files=() 它不起作用(只处理第一个文件):./rfs.sh ~/Music/*.mp3

rfs.sh

files=(~/Music/*.mp3)

for ((i=0; i<${#files[@]}; i++)); do
    oldname="${files[$i]}"
    newname=`echo "$oldname" | sed -E 's/\/[0-9]+ /\//'`
    echo "$oldname ---> $newname"
    mv "$oldname" "$newname"
done

考虑 rename :

rename -n 's!/\d+\s+!/!' ~/Music/*.mp3

当输出看起来不错时移除 -n 开关。

man rename

有其他同名工具可能无法做到这一点,所以要小心。

util-linux 包中的重命名命令不会。

如果你运行以下命令(GNU)

$ file "$(readlink -f "$(type -p rename)")"

并且您的结果包含 Perl script, ASCII text executable 而不包含 ELF,那么这似乎是正确的工具 =)

如果不是,将其设为 Debian 的默认值(通常已经是这种情况)和 Ubuntu 之类的派生词:

$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename

如果您在其他发行版中没有此命令,请搜索您的包管理器进行安装或 do it manually(无依赖...)


这个工具最初是由 Perl 之父 Larry Wall 编写的。

markp-fuso 在他的 中说的完全正确。

这是您在 中实现目标的方法(如果您喜欢结果,请删除 echo

#!/bin/bash

for file in "$@"; do
  dirname=${file%/*}
  basename=${file##*/}

   echo mv "$file ${dirname}/${basename//[[:digit:]][[:digit:]]* /}"
done  

概念验证

$ ls *.mp3
'1234 foo.mp3'  '5678 bar.mp3'

$ mp3(){ for file in "$@"; do dirname=${file%/*}; basename=${file##*/}; echo mv "$file ${dirname}/${basename//[[:digit:]][[:digit:]]* /}"; done;}; mp3 ./*.mp3
mv ./1234 foo.mp3 ./foo.mp3
mv ./5678 bar.mp3 ./bar.mp3