剪切具有相同分隔符的多个实例的目录名称(Shell)

剪切具有相同分隔符的多个实例的目录名称(Shell)

我有要重命名的目录,例如:10-00017_S9_L001_plasmidspades_careful

我想将它们重命名为10-00017_S9_L001部分

我尝试使用 cut 命令echo "$filename" | cut -d'_' -f3,但这只留下文件名的 L001 部分。

显然我可以手动重命名它们,但是目录有数百个,我没有时间。

有没有办法使用 cut 命令来获取分隔符的特定实例之前的所有内容,或者实际上我可以使用的任何其他内容?

答案1

最好的解决方案是使用rename(Debian)或prename(RedHat)(相同的命令,不同的名称)(这些软件包可能必须从标准发行版存储库中添加)。它使用正则表达式(Perl 风格)。例如,尝试对比赛严格一些:

rename -n 's/(\d+_\d+_S\d_L\d+)_.+/$1/' *

或更宽松的:

rename -n 's/(.+_.+_.+_.+)_.+/$1/' *

-n只是显示了它会做什么,删除(或者更好的是,替换为-v)以进行实际执行。

请注意模式周围的单引号,以避免 bash 替换反斜杠和美元。

答案2

一个技术含量相当低的解决方案:

  • 使用lsfind创建文件中的目录列表
  • 使用您熟悉的编辑器替换每一行(仅包含oldnameby mv oldname newname
  • 执行脚本:

    . list_of_moves
    

    (注意前导点间距)

答案3

将所有目录放在一个文件中并执行以下命令以将其重命名

awk '{print "mv"  " "   $1  " " substr($1,1,16)}' filename | sh

测试了上述 dirtectoy,效果很好

echo "10-00017_S9_L001_plasmidspades_careful" | awk '{print "mv"  " "   $1  " " substr($1,1,16)}' | sh

相关内容