如何快速更改长文件名的扩展名?

如何快速更改长文件名的扩展名?

原始文件:a really really long name with spaces.ext
目标文件:the same name.new-ext

命令:mv *part of the name that'll give a unique answer.ext $(echo $(ls -l | grep -i *.ext | cut -d ' ' -f 11-))

结果:mv: target 'last word of the name.ext': No such file or directory

我究竟做错了什么?

PS:远程计算机只允许sh(甚至不允许 bash),因此制表符补全是不可能的。

答案1

你可以这样做:

for f in *long*.ext; do mv -- "$f" "${f%.ext}.new-ext"; done

或者在包括 dash 和 busybox ash (不是 hush)在内的多个 shell 中,其中$_扩展为上一个命令的最后一个参数:

echo *long*

检查它是否显示正确的文件,然后:

mv -- "$_" "${_%.ext}.new-ext"

答案2

输出中文件名之前的空格数ls -l变化很大,通常不是 10 个。字符数也变化,因此cut -c也不安全。

ls但你根本不需要(也不应该想要grep -i,因为那样会需要 ExT)——就$(echo *blah.ext |sed s/ext$/new-ext$/)可以了。

(已更正)在 bash/ksh/zsh 中更好,我会f=(*ext); mv -- "$f" "${f%.ext}.new-ext"考虑为${#f[@]} -gt 1.如果卡在 POSIX(例如 dash、ash、busybox)上,可以使用set -- *blah.ext; if [ "$#" -eq 1 ]; then mv -- "$1" "${1%.ext}.new-ext"; else echo>&2 "error: $# files match"; fi.

答案3

最简单的方法是使用以下rename命令:

rename '.old' '.new' *'long'*'.old'

我们使用引号,因为任何字符串都可能包含空格。

相关内容