【问题标题】:How can I change the order of some string in a filename如何更改文件名中某些字符串的顺序
【发布时间】:2019-04-04 10:17:44
【问题描述】:

我有很多这样的文件:

tf_CVBV6Z_CVSA1Z_pws2_pcc1.sac
tf_CVBV5Z_CVSA2Z_pws2_pcc1.sac
tf_CVBV4Z_CVSA3Z_pws2_pcc1.sac
tf_CVBV3Z_CVSA4Z_pws2_pcc1.sac
tf_CVBV2Z_CVSA5Z_pws2_pcc1.sac
tf_CVBV1Z_CVSA6Z_pws2_pcc1.sac

我想改变顺序,最终变成这样:

tf_CVSA1Z_CVBV6Z_pws2_pcc1.sac
tf_CVSA2Z_CVBV5Z_pws2_pcc1.sac
tf_CVSA3Z_CVBV4Z_pws2_pcc1.sac
tf_CVSA4Z_CVBV3Z_pws2_pcc1.sac
tf_CVSA5Z_CVBV2Z_pws2_pcc1.sac
tf_CVSA6Z_CVBV1Z_pws2_pcc1.sac

我尝试了重命名选项,但它不起作用。

有什么想法吗?

谢谢

【问题讨论】:

  • 修复了什么部分?我们可以匹配下划线吗?当新文件名已经存在或不可能(文件tf_a_b_pws2.pcc1.sactf_b_a_pws2.pcc1.sac 都存在)时该怎么办。

标签: string bash filenames


【解决方案1】:

使用 perl 的重命名:

$ rename -n 's/(CV[^_]+)_(CV[^_]+)/$2_$1/' tf_CVSA1Z_CVBV6Z_pws2_pcc1.sac
tf_CVSA1Z_CVBV6Z_pws2_pcc1.sac -> tf_CVBV6Z_CVSA1Z_pws2_pcc1.sac

当输出看起来不错时移除-n开关。

还有其他同名的工具可能会也可能不会做到这一点,所以要小心。

如果您运行以下命令 (GNU)

$ file "$(readlink -f "$(type -p rename)")"

而您的结果包含 Perl script, ASCII text executable 而不包含 ELF,那么这似乎是正确的工具 =)

如果不是,则将其设为 Debian 和派生类 Ubuntu 的默认值(通常已经如此):

$ sudo update-alternatives --set rename /path/to/rename

/path/to/rename 替换为您的perl rename 可执行文件的路径。


如果你没有这个命令,搜索你的包管理器来安装它或do it manually(没有deps...)


这个工具最初是由 Perl 的父亲 Larry Wall 编写的。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多