我想用recon.text
目录名重命名该文件。我有 1000 个目录。请帮忙吗?
7_S4_R1_001_tri10_sha/recon.text
8_S1_R1_001_tri15_sha/recon.text
9_S8_R1_001_tri20_sha/recon.text
10_S5_R1_001_tri25_sha/recon.text
11_S3_R1_001_tri30_sha/recon.text
答案1
和改名:
rename -n 's!(.*sha)/recon\.text!$1/$1.txt!' */recon.text
-n
当输出看起来不错才能真正重命名时,请删除开关。
还有其他同名的工具可能能够也可能无法做到这一点,所以要小心。
作为包一部分的重命名命令util-linux
不会。
如果运行以下命令 ( GNU
)
$ file "$(readlink -f "$(type -p rename)")"
并且您得到的结果包含Perl script, ASCII text executable
且不包含ELF
,那么这似乎是正确的工具 =)
如果不是,则将其设为默认值(通常已经是这种情况)Debian
并衍生如下Ubuntu
:
$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename
对于 RedHat 系列发行版:
yum install prename
'prename' 包位于EPEL存储库。
对于 archlinux:
pacman -S perl-rename
对于 *BSD:
pkg install gprename
或者p5-File-Rename
对于 Mac 用户:
brew install rename
如果您的其他发行版没有此命令,请搜索您的软件包管理器来安装它或手动做(没有部门...)
这个工具最初是由 Perl 之父 Larry Wall 编写的。
答案2
仅使用标准工具,您可以在父目录中执行此操作:
for file in */recon.text; do mv -- "$file" "${file%/*}/${file%/*}"; done
它将找到的每个文件重命名$file
为${file%/*}/${file%/*}
,其中${file%/*}
表示“已删除的文件路径” /[anything...]
。
例如,对于7_S4_R1_001_tri10_sha/recon.text
文件,
${file%/*}
扩展到7_S4_R1_001_tri10_sha
- 然后
${file%/*}/${file%/*}
是7_S4_R1_001_tri10_sha/7_S4_R1_001_tri10_sha
。 - 那么执行的操作是
mv -- "7_S4_R1_001_tri10_sha/recon.text" "7_S4_R1_001_tri10_sha/7_S4_R1_001_tri10_sha"
。
do
您可以在和之间添加回显,mv
以在实际执行该命令之前查看该命令将执行的操作。