将目录中的所有文件从$ filename_h重命名为$ filename_half?

Ric*_*ard 121 bash shell

死简单.

我该如何重命名

05_h.png
06_h.png
Run Code Online (Sandbox Code Playgroud)

05_half.png
06_half.png
Run Code Online (Sandbox Code Playgroud)

至少,我认为这很简单,但除非你已经知道,谷歌很难做到这一点.

谢谢....

bas*_*ist 273

只需使用bash,无需调用外部命令.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done
Run Code Online (Sandbox Code Playgroud)

不要添加 #!/bin/sh

对于那些需要单行的人:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
Run Code Online (Sandbox Code Playgroud)

  • 不,格式如下:$ {string/substring/substitution} - "替换第一次出现".有关详细信息,请查看此备忘单("字符串"部分):http://bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf (15认同)
  • "不要添加#!/ bin/sh`的任何原因?我尝试使用/不使用此语句. (11认同)
  • 很好地使用bash的内置字符串替换而不是sed (6认同)
  • @Ryan @Ishan Jain实际上它表示必须执行脚本的后端shell.sh和bash是不同的shell,因此它可能会影响脚本行为和语法.由于脚本使用bash内置字符串替换,因此您应该添加标题`#!/ bin/bash`.这就是说,bash通常是许多计算机中的默认shell,所以你不会发现很多差异:D你可以在[这里]找到更多信息(https://askubuntu.com/questions/141928/what-is-difference-between -bin-SH-和彬的bash) (4认同)
  • 是file / _h.png / _half.png正则表达式? (3认同)

Mic*_*jer 54

尝试rename命令:

rename 's/_h.png/_half.png/' *.png
Run Code Online (Sandbox Code Playgroud)

更新:

示例用法:

创造一些内容

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png
Run Code Online (Sandbox Code Playgroud)

测试方案:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png
Run Code Online (Sandbox Code Playgroud)

  • fwiw 在 Mac 上的 bash 中不起作用。`rename` 不是标准的 Unix 工具。 (3认同)
  • 至于我重命名不适用于```` - 我引用了man并且有简单的概要:`rename [options]表达式替换文件...`,在CentOS 7上,版本:`rename from util- linux 2.23.2` (3认同)
  • @tandrewnichols,尝试 [homebrew](http://brew.sh/) - 安装后,使用 `brew install rename` 可以在几秒钟内重命名 (2认同)
  • 请记住`.`匹配任何字符,而不仅仅是一个点 - 对于文字点,请改用`\ .` (2认同)

Kar*_*ath 9

for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done
Run Code Online (Sandbox Code Playgroud)


Sor*_*gal 9

您在寻找纯粹的bash解决方案吗?有很多方法,但这里有一个.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done
Run Code Online (Sandbox Code Playgroud)

这假定当前目录中唯一以_h.png您要重命名的文件结尾.

更具体地说

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done
Run Code Online (Sandbox Code Playgroud)

假设这两个例子是你唯一的例子.文件.

对于一般的情况下,重命名文件中 覆盖 .


Fre*_*ihl 6

使用rename用 perl 编写的实用程序。可能是默认情况下它不可用...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png
Run Code Online (Sandbox Code Playgroud)


zta*_*013 5

for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
Run Code Online (Sandbox Code Playgroud)


小智 5

我有一个类似的问题:在手册中,它描述了重命名为

rename [option] expression replacement file
Run Code Online (Sandbox Code Playgroud)

所以你可以这样使用它

rename _h _half *.png
Run Code Online (Sandbox Code Playgroud)

在代码中:“_h”是您要查找的表达式。'_half' 是您要替换的模式。“*.png”是您正在寻找可能的目标文件的文件范围。

希望这可以帮助c: