【问题标题】:Cut sub-string and rename files use shell command [duplicate]使用 shell 命令剪切子字符串和重命名文件 [重复]
【发布时间】:2015-05-19 09:23:26
【问题描述】:

如何重命名文件名?我想映射名称:

abc-hdpi.png ⟶ abc.png
bcd-hdpi.png ⟶ bcd.png

...

我有很多文件要这样做,所以mv abc-hdpi.png abc.png 不是一个好的解决方案。

【问题讨论】:

  • 您想删除什么,更具体地说?是所有文件都命名为*-hdpi.png,还是要删除破折号后的所有内容?
  • 是的,所有名为*-hdpi.png的文件,我想丢弃-hdpi,重命名为*.png。谢谢。

标签: shell


【解决方案1】:

搜索prename(Perl rename)命令;它可以轻松完成工作:

prename 's/-hdpi.png/.png/' *-hdpi.png

失败了:

for file in *-hdpi.png
do
    mv "$file" "${file%-hdpi.png}.png"
done

【讨论】:

  • 是的,这样更好。
  • prename 不工作,终端告诉substitution replacement not terminated at (eval 1) line 1
  • for do done 工作,谢谢:)
  • 如果您的机器上有 prename 无法正常工作,我感到很困惑。你确实包括了单引号,不是吗?我很高兴 for 循环可以作为后备。
【解决方案2】:

您可以像这样从固定长度的字符串中提取:

NAME[0]="abc-hdpi.png"
NAME[1]="def-hdpi.png"
NAME[2]="ghi-hdpi.png"
NAME[3]="jkl-hdpi.png"
NAME[4]="mno-hdpi.png"

rename(){
    var=$1
    mv $var $var{0:2}$var{8:}
}

for i in "${Name[@]}"
do
    rename $i
done

【讨论】:

  • $var = $1 不起作用;在 shell 分配中 = 周围没有空格,并且在分配的 LHS 上的名称之前没有 $。不能用循环遍历数组吗?
  • 谢谢,将 $var 更改为 var
  • 仅供参考,您可以使用以下命令初始化数组:NAME=("abc-hdpi.png" "def-hdpi.png" "ghi-hdpi.png" "jkl-hdpi.png" "mno-hdpi.png")
  • 很抱歉描述不明确,前缀不是固定长度的。所以你的答案可能不适合这种情况。非常感谢您的即时答复。 :)
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 2011-12-27
  • 2019-10-05
  • 2013-04-23
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多