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
考虑 perl 的 rename
:
rename -n 's!/\d+\s+!/!' ~/Music/*.mp3
当输出看起来不错时移除 -n
开关。
有其他同名工具可能无法做到这一点,所以要小心。
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 在他的 中说的完全正确。
这是您在 bash 中实现目标的方法(如果您喜欢结果,请删除 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
这个 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
考虑 perl 的 rename
:
rename -n 's!/\d+\s+!/!' ~/Music/*.mp3
当输出看起来不错时移除 -n
开关。
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 在他的
这是您在 bash 中实现目标的方法(如果您喜欢结果,请删除 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