删除文件名的前 4 个符号

删除文件名的前 4 个符号

12xy[..].log我遇到以下问题:我想将文件重命名为to格式[...].log

我的问题是,其中一些a第一次就有关注,有些则有v- 所以我不能使用遵循将部分名称替换为某个字符的逻辑的命令。 (如下划线等)

有什么办法可以快速重命名它们吗?

编辑: 始终有相同的前缀MD18。例如,有一些文件被命名,MD18v230_SHAPE.log或者另一个文件被命名MD18a004_FACES.log,等等。我希望将它们命名为v230_SHAPE.loga004_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 个字符。

相关内容