将文件名的最后一部分移到开头

Move last part of a file name to the begin

我想修改一个文件夹中多个文件的名称。名称采用以下格式:

Name_name_name_name_XXXX.fa

我愿意:

XXXX_Name_name_name_name.fa

我厌倦了使用

for f in *.fa; do mv "${f/.fa/Name_name_name_name.fa}";done

output Name_name_name_name_XXXX_Name_name_name_name.fa

然后

for f in *.fa; do mv "${f/Name_name_name_name_//}"; done

删除 4 name_name。但是没用。

知道怎么做吗?

您可以使用 sed:

for f in *.fa; do
   mv "$f" $(sed -E 's/^(.+)_([^.]+)\./_./' <<< "$f")
done

sed 命令使用 2 个捕获组。第一组包含最后一个下划线之前的字符串,第二组包含 XXXX 部分(最后一个 _` 和点之间的部分)。

尝试使用 perl 的 在一个命令中使用正则表达式 捕获组:

rename -n 's/(.*?)_([^_]+)\.fa$/_/' *.fa

(当您的测试正常时移除 -n 开关)

有其他同名工具可能无法做到这一点,所以要小心。

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

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

你得到了这样的结果

.../rename: Perl script, ASCII text executable

且不包含:

ELF

那么这似乎是正确的工具 =)

如果不是,将其设为 Debian 的默认值(通常已经是这种情况)和 Ubuntu 之类的派生词:

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

(将 /path/to/rename 替换为您的 perl's rename 命令的路径。


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


最后但同样重要的是,这个工具最初是由 Perl 之父 Larry Wall 编写的。