将目录中的所有文件从 $filename_h 重命名为 $filename_half?
Posted
技术标签:
【中文标题】将目录中的所有文件从 $filename_h 重命名为 $filename_half?【英文标题】:Rename all files in directory from $filename_h to $filename_half? 【发布时间】:2011-11-19 00:46:20 【问题描述】:很简单。
如何重命名
05_h.png
06_h.png
到
05_half.png
06_half.png
至少,我认为这很简单,但是除非您已经知道,否则很难通过 Google 搜索到这种东西。
谢谢....
【问题讨论】:
【参考方案1】:for f in *.png; do
fnew=`echo $f | sed 's/_h.png/_half.png/'`
mv $f $fnew
done
【讨论】:
这对于事先进行试运行非常有用。我首先将mv $f $fnew
替换为echo $fnew
作为第二行,以确保输出看起来正常。【参考方案2】:
使用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
【讨论】:
【参考方案3】:使用用 perl 编写的 rename
实用程序。
可能是默认情况下它不可用...
$ touch 05..6_h.png
$ ls
05_h.png 06_h.png
$ rename 's/h/half/' *.png
$ ls
05_half.png 06_half.png
【讨论】:
【参考方案4】:试试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
【讨论】:
@CarolineAlexiou:我添加了示例测试会话。请尝试一下。你可能有一些错字。ls
的输出是什么?你尝试的rename ...
是什么?
在 Mac 上的 bash 中不起作用,fwiw。 rename
不是标准的 Unix 工具。
@tandrewnichols,试用homebrew - 安装后,使用brew install rename
可以在几秒钟内重命名
对我来说 rename 不适用于 's//'
- 我引用了 man 并且有简单的概要:rename [options] expression replacement file...
,在 CentOS 7 上,版本:rename from util-linux 2.23.2
请记住,.
匹配任何字符,而不仅仅是点 - 对于文字点,请改用 \.
【参考方案5】:
for i in *_h.png ; do
mv $i `echo "$i"|awk -F'.' 'print $1"alf."$2'`
done
【讨论】:
【参考方案6】:您在寻找纯 bash 解决方案吗?方法有很多,这里有一个。
for file in *_h.png ; do mv "$file" "$file%%_h.png_half.png" ; done
这假定当前目录中唯一以_h.png
结尾的文件是您要重命名的文件。
更具体
for file in 05..6_h.png ; do mv "$file" "$file/_h./_half." ; done
假设这两个例子是你唯一的。文件。
对于一般情况,has 中的文件重命名 beencovered before.
【讨论】:
【参考方案7】:只需使用 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
【讨论】:
很好地使用 bash 的内置字符串替换而不是 sed 是文件/_h.png/_half.png 正则表达式吗? 不,格式是这样的:$string/substring/substitution - “替换第一次出现”。有关更多信息,请查看此备忘单(“字符串”部分):bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdfDo not add #!/bin/sh
有什么原因吗?我尝试使用/不使用此语句。
@Ryan @Ishan Jain 实际上它表示必须执行脚本的后端shell。 sh 和 bash 是不同的 shell,因此它可能会影响脚本的行为和语法。由于脚本使用 bash 内置字符串替换,您应该添加标题 #!/bin/bash
。这就是说,bash 通常是许多计算机中的默认 shell,因此您不会发现很多差异 :D 您可以找到更多信息here【参考方案8】:
另一种方法可以手动使用批量重命名选项
右键文件->文件自定义命令->批量重命名 你可以替换 h。有一半。
这将适用于使用 WinSCP 等的基于 linux 的 gui
【讨论】:
【参考方案9】:一个班轮:for file in *.php ; do mv "$file" "_$file" ; done
【讨论】:
【参考方案10】:我有一个类似的问题: 在手册中,它描述了重命名为
rename [option] expression replacement file
所以你可以这样使用它
rename _h _half *.png
在代码中: '_h' 是您要查找的表达式。 '_half' 是您要替换的模式。 '*.png' 是您正在寻找可能的目标文件的文件范围。
希望这可以帮助 c:
【讨论】:
【参考方案11】:虽然答案集是完整的,但我需要再补充一个缺失的。
for i in *_h.png;
do name=`echo "$i" | cut -d'_' -f1`
echo "Executing of name $name"
mv "$i" "$name_half.png"
done
【讨论】:
以上是关于将目录中的所有文件从 $filename_h 重命名为 $filename_half?的主要内容,如果未能解决你的问题,请参考以下文章