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

时间:2018-02-23 15:01:24

标签: bash file-rename mv

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

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。但它没有用。

知道该怎么做吗?

2 个答案:

答案 0 :(得分:1)

您可以使用sed

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

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

答案 1 :(得分:1)

使用regex 捕获组在一个命令中使用perl 尝试此操作:

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

(当你的测试没问题时删除-n开关)

warning 还有其他同名工具可能会或可能不会这样做,所以要小心。

如果您运行以下命令(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编写的。