原始文件: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'
我们使用引号,因为任何字符串都可能包含空格。