如何使用其父目录的名称重命名文件?

如何使用其父目录的名称重命名文件?

我想用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以在实际执行该命令之前查看该命令将执行的操作。

相关内容