![剪切具有相同分隔符的多个实例的目录名称(Shell)](https://linux22.com/image/142161/%E5%89%AA%E5%88%87%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E5%88%86%E9%9A%94%E7%AC%A6%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%AE%9E%E4%BE%8B%E7%9A%84%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%EF%BC%88Shell%EF%BC%89.png)
我有要重命名的目录,例如: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
一个技术含量相当低的解决方案:
- 使用
ls
或find
创建文件中的目录列表 - 使用您熟悉的编辑器替换每一行(仅包含
oldname
bymv 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