【问题标题】:How to remove leading dash from filenames in Bash如何从 Bash 中的文件名中删除前导破折号
【发布时间】:2017-03-06 17:13:55
【问题描述】:

我有一个目录,其中包含以下文件:

-001.jpg
-002.jpg
...
-100.jpg

我想删除每一个的前导破折号。

我试过了:

rename -vn 's/^-//g' *

但我明白了:

Unknown option: 0
Unknown option: 0
Unknown option: 0
Unknown option: .
Unknown option: j
Unknown option: p
Unknown option: g
Unknown option: 0
Unknown option: 0

等等……

一个人怎么玩这个把戏?

【问题讨论】:

标签: bash rename


【解决方案1】:

只需shell参数扩展,无需外部工具:

shopt -s nullglob
for f in *.jpg; do mv -- "$f" "${f#-}"; done

nullglob shell 选项确保*.jpg 在不匹配任何文件时不会扩展为任何内容; "${f#-}" 扩展为存储在 f 中的文件名减去前导连字符。

需要mv -- 以防止文件名被解释为mv 的选项。


并非所有版本的mv 都将-- 理解为选项的分隔符。据我所知,例如POSIX 不需要它。更便携的版本是使用

for f in *.jpg; do mv "./$f" "./${f#-}"; done

相反。感谢Gordon Davisson 指出这一点。

【讨论】:

  • 并非所有版本的mv 都将-- 理解为分隔符。使用mv "./$f" "./${f#-} 更便携(./ 前缀可以防止误解析,但不会影响它)。
【解决方案2】:

- 被视为rename 命令的一个选项。

你可以像这样使用rename

rename -vn -- 's/^-//' *

【讨论】:

  • 并且没有必要使用g(全局),因为我们只是在开始时删除-
  • 谢谢!不知道这个!
  • 顺便说一句,bash中的双破折号“--”是否有特定含义?
  • -- 用参数分隔选项。
猜你喜欢
  • 2016-12-06
  • 2023-01-23
  • 1970-01-01
  • 2022-11-14
  • 2011-02-12
  • 2015-09-11
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
相关资源
最近更新 更多