将文件名的最后一部分移到开头
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 在一个命令中使用正则表达式 捕获组:
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 编写的。
我想修改一个文件夹中多个文件的名称。名称采用以下格式:
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 在一个命令中使用正则表达式 捕获组:
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 编写的。