抱歉,我问了这个问题。我在网上搜索了很多,但找不到可行的答案(尽管有很多建议)。
因此,我想重命名很多文件。写入所有文件名不是一个选项。文件名称如下:
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_patternXoptions
(X
可以是任何字符)。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