【问题标题】:MacOS bash alias breaks at mv commandMacOS bash 别名在 mv 命令处中断
【发布时间】:2018-05-04 05:17:28
【问题描述】:

我正在尝试重命名大约 40 张图片(“1.png”为“40.png”)。

第一个命令在终端中起作用:

user$ ls | cat -n | while read n f; do mv "$f" "$n.png"; done

但我想将该命令设为 ~/.bash_profile 中的别名。

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

有人可以向我解释我做错了什么吗?

【问题讨论】:

  • 前。 alias l='ls -lp'所以修改你的别名定义,把=后面的部分用'引号括起来。
  • 顺便说一句,反斜杠,而不是正斜杠,用于在双引号中转义——你也需要转义$s(虽然它会更明智如果要使用别名,请使用单引号,正如 chepner 所说,此用例的错误之处)。
  • 事后看来,那是我的错,我最初在测试时使用了反斜杠。作为一个例子,我很快就提出了这个答案。我也尝试转义货币符号和单引号以开始,它仍然在 mv 处中断。目前正在查看 ls 的未解析输出。

标签: bash macos alias


【解决方案1】:

不要为这么复杂的东西使用别名;只需使用一个功能。此外,不要尝试使用ls 的输出。使用带有模式的 for 循环:

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

【讨论】:

  • 可能会使用local i=0 以避免留下全局变量i(当然,是的,原来的别名也会这样做)。
  • 我将添加我对mv -nmv -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: line 9: `rename-png': not a valid identifier
  • 您正在使用sh 运行脚本,而不是bash;连字符不是 POSIX shell 中的有效函数名称字符。
  • @UsernameError3, ...也就是说,将名称更改为rename_png,它将适用于所有POSIX shell。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多