MacOS bash别名在mv命令处中断

MacOS bash别名在mv命令处中断,bash,macos,alias,Bash,Macos,Alias,我正在尝试重命名大约40幅图像(“1.png”改为“40.png”) 第一个命令在终端中工作: user$ ls | cat -n | while read n f; do mv "$f" "$n.png"; done 但是我想在~/.bash_配置文件中将该命令转换为别名 alias rename-png="ls | cat -n | while read n f; do mv "$f" "&n.png"; done" alias rename-png="ls | cat -n |

我正在尝试重命名大约40幅图像(“1.png”改为“40.png”)

第一个命令在终端中工作:

user$ ls | cat -n | while read n f; do mv "$f" "$n.png"; done
但是我想在~/.bash_配置文件中将该命令转换为别名

alias rename-png="ls | cat -n | while read n f; do mv "$f" "&n.png"; done"

alias rename-png="ls | cat -n | while read n f; do mv /"$f/" /"&n.png/"; done"

rename-png() {
    ls | cat -n | while read n f; do mv "$f" "$n.png"; done
}
第一个别名不起作用,我认为这是因为没有转义引号。但是,即使在转义双引号时,命令也会在
mv
处中断。我还在函数中尝试了它,但也没有成功

错误:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

有人能解释一下我做错了什么吗?

不要用别名来形容这么复杂的事情;只需使用一个函数。此外,不要尝试使用
ls
的输出。将
用于带有图案的
循环:

rename-png () {
  i=0
  for f in ./*; do
    mv "$f" "$i.png"
    i=$((i + 1))
  done
}  

例如,
alias l='ls-lp'
因此,修改别名定义,将部分括在“=in”引号后。请注意,反斜杠而不是正斜杠用于双引号转义,您还需要转义
$
s(尽管如果要使用别名,使用单引号会更明智,正如切普纳所说,这对于这个用例来说是错误的).事后看来,这是我的错,我最初在测试时使用了反斜杠。作为一个例子,我很快就给出了这个答案。我也尝试了避开货币符号和单引号,开始时它仍然在mv处中断。查看ls当前未解析的输出。可能会使其成为
局部I=0
,以避免留下全局变量
i
around(当然,是的,原始别名也会这样做)。我将添加我通常请求的
mv-n
mv-i
,以避免在名称冲突的情况下覆盖文件。例如,如果有名为“0.png”和“1.png”的文件,它将首先将0.png重命名为1.png(覆盖原始的1.png),然后将同一个文件从1.png重命名为2.png。结果:0.png变为2.png,1.png消失得无影无踪。我把它放在一个test.sh中,我得到:test.sh:第9行:`rename png':不是一个有效的标识符您运行脚本时使用的是
sh
,而不是
bash
;连字符在POSIX shell中不是一个有效的函数名字符。@UsernameError3,…也就是说,将名称更改为
rename_png
,它将在所有POSIX shell中工作。