12xy[..].log
我遇到以下问题:我想将文件重命名为to格式[...].log
。
我的问题是,其中一些a
第一次就有关注,有些则有v
- 所以我不能使用遵循将部分名称替换为某个字符的逻辑的命令。 (如下划线等)
有什么办法可以快速重命名它们吗?
编辑: 始终有相同的前缀MD18
。例如,有一些文件被命名,MD18v230_SHAPE.log
或者另一个文件被命名MD18a004_FACES.log
,等等。我希望将它们命名为v230_SHAPE.log
和a004_FACES.log
。
答案1
我会使用专为批量重命名而设计的工具,因为它们擅长在做任何事情之前进行健全性检查,或者具有试运行模式,可以向您展示它们会做什么而不是实际执行。
其中有几种,最流行的是 perl 的rename
,这是一个非常短的示例脚本,自 80 年代以来一直随带perl
,但仍然发展为更高级的东西(及其几个变体)。这样就可以使用 的perl
字符串处理功能的所有功能,因此可能性是无限的。
rename
包中还调用了一个不相关但非常有限的命令util-linux
。
mmv
是一款专用的批量重命名工具,也是80年代的。它曾经很流行,但最近似乎已经过时了。
zsh
带有zmv
自动加载功能,可以使用 zsh 文件名生成和扩展运算符的全部功能。
在这里,您的任务相对简单,因为只需删除以 开头的文件的前 4 个字符MD18
,因此:
rename 's/^MD18//' MD18*.log
mmv 'MD18*.log' '#1.log'
autoload zmv
zmv 'MD18(*.log)' '$1'
您还可以始终在更简单的 shell 中使用循环,例如bash
:
for file in MD18*.log; do
mv -i "$file" "${file#MD18}"
done
但它不会有任何专用工具的保障。在这里,我们仍然使用-i
尽管在文件丢失/覆盖的过程中给用户一个中止的机会。还可以通过在命令前面添加 来执行试运行echo
。
答案2
所有这些文件名是否都以 12xy 开头,还是要删除文件名的前 4 个字符(无论它们是什么)?您的所有文件名都是这样的吗 - 12xy_lmn.log、12xydef.log、12xyabc.log、12xyvw.log,...?
如果是这样,您可以使用 for 循环重命名:
for fn in ./12xy*.log
do
mv -i "$fn" "$(sed -e 's/^12xy//' <<< "$fn")"
done
如果您可以接受碰撞,您可以将“mv -i”更改为“mv”。
但是,如果您想删除文件名中的前 4 个字符,无论它们是什么,请使用:
for fn in ./*.log
do
mv -i "$fn" "$(sed -e 's/^....//' <<< "$fn")"
done
答案3
for file in /path/to/MD18*.log; do
name=$(echo "$file" | sed -E 's/.{4}(.*)/\1/')
mv "$file" "$name"
done
这将删除前 4 个字符。