我想修改文件夹中几个文件的名称。名称采用以下格式:
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。但它没有用。
知道该怎么做吗?
答案 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尝试此操作:
rename -n 's/(.*?)_([^_]+)\.fa$/$2_$1/' *.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编写的。