如何在 bash shell 中重命名大量文件?

如何在 bash shell 中重命名大量文件?

抱歉,我问了这个问题。我在网上搜索了很多,但找不到可行的答案(尽管有很多建议)。

因此,我想重命名很多文件。写入所有文件名不是一个选项。文件名称如下:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

开头总是相同的,.IMA 的长数字对于所有文件来说都不相同。我必须将所有文件的 039 更改为 036_2。其余部分应保持不变。

我尝试了以下所有命令(以及其他几个命令),但没有任何反应:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl 安装在 linux 系统上(但我不确定如何调用它……因为如果我打开 perl 终端,它不会执行任何操作)。

你能帮助我吗?

答案1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

解释:

for file in * ; do _______ ; done

bash 将执行 shell 扩展以*列出工作目录中的每个文件。对于每个文件,此命令结构将设置变量file等于文件名,并在; do和之间运行命令; done

mv $file _______

mv是 unix/linux 中重命名文件的传统方法。它将重命名file_______

echo $file | sed 's/_039/_036_2'

echo $file | sed只会将“ file”发送到 的标准输入sed,其中sed将用“_039”替换“_036_2”

总之:对于当前目录中的每个文件,重命名该文件,用“_039”替换“_036_2”

答案2

你的正则表达式搞乱了,这里有一个应该可以工作的。

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

您正在使用正确的工具,除非您有子目录,否则无需查找。


注意 sed 和 rename 中的正则表达式。

格式为sXsearch_patternXreplace_patternXoptionsX可以是任何字符)。searchPattern 是您要替换的内容,即已经存在的内容,而不是您要替换的内容。

-w是一个单词,并且只能出现在 search_pattern 中。

答案3

查找 . -name "*039*" | 重命名 's/039/036_2/g'

答案4

循环所有带有“HAUPT_...”前缀的文件,然后使用 shell 子字符串重命名${f:15}并返回从文件名的第 15 个字符附加到HAUPT_...前缀的字符串。

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

编辑 - 包含所有文件的目录似乎还包含具有相同 HAUPT... 前缀的子目录。在这种情况下,请使用命令find首先仅过滤文件而不过滤目录。

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

相关内容