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


139

死了很简单。

我如何重命名

05_h.png
06_h.png

05_half.png
06_half.png

至少,我认为这很简单,但是除非您已经知道,否则Google很难做到这一点。

谢谢....

Answers:


301

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

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

不加 #!/bin/sh

对于那些需要一线的人:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
bash的内置字符串替换而不是sed的
很好用法

3
是file / _h.png / _half.png正则表达式?
user2799603 2014年

15
不,格式是这样:$ {string / substring / substitution} –“替代第一次出现”。有关更多信息,请检查以下备忘单(“字符串”部分):bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider 2014年

11
Do not add #!/bin/sh什么原因吗?我尝试过使用/不使用此语句。
Ryan

6
@Ryan @Ishan Jain实际上,它指示必须执行脚本的后端外壳。sh和bash是不同的shell,因此可能会影响脚本的行为和语法。由于脚本使用bash内置字符串替换,因此应添加header #!/bin/bash。这就是说,bash通常是许多计算机上的默认外壳,因此您不会发现很多不同之处:D您可以在此处
Cristian Ramon-Cortes

65

尝试rename命令:

rename 's/_h.png/_half.png/' *.png

更新:

用法示例:

创建一些内容

$ 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

测试解决方案:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou:我添加了示例测试会话。请尝试一下。您可能有错字。输出是ls什么?什么是rename ...你试试?
米哈尔Šrajer

2
Fwiw,不适用于Mac上的bash。rename不是标准的Unix工具。
tandrewnichols 2015年

1
@tandrewnichols,尝试自制软件 -安装完成后,即可在几秒钟内使用brew install rename
Simbamangu

4
至于我,重命名不起作用's//'-我引用了man,有一个简单的提要:rename [options] expression replacement file...在CentOS 7上,版本:rename from util-linux 2.23.2
tymik 2015年

2
请记住,.任何字符,而不仅仅是一个点相匹配-字面点,使用\.替代
迈斯纳

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
这对于事先进行空试非常有用。我先被替换mv $f $fnewecho $fnew作为第二线,以确保输出看起来神志清醒。
lobati

10

您是否正在寻找纯bash解决方案?有很多方法,但这是一种。

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

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

更具体地说

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

假设这两个例子是您唯一的。文件。

对于一般情况下,文件重命名已经 覆盖



4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

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

rename [option] expression replacement file

所以你可以用这种方式

rename _h _half *.png

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

希望这可以帮助c:


1

另一种方法可以使用批处理重命名选项手动进行

右键单击文件->文件自定义命令->批量重命名,然后可以替换h。与一半。

这将适用于使用WinSCP等基于Linux的gui


0

使用该rename实用程序:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png

0

一班轮:
for file in *.php ; do mv "$file" "_$file" ; done


0

尽管答案是完整的,但我需要添加另一个缺失的答案

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.