2016-11-24 111 views
1

我试图使用bash重命名一个特定的file type,它是.bam.bai并且无法删除文件名中第二个下划线_后面的文本。目前我只得到一个文件返回第一个_后重命名,另外两个文件被删除,我会假设因为它们是重复的。谢谢你,祝你度过愉快的假期:)。bash重命名目录中的特定文件类型

文件到/ home/cmccabe /示例/文件夹

IonXpress_007_MEVxz_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai 
IonXpress_008_MEVxx_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai 
IonXpress_009_MEVxy_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai 

期望的输出

IonXpress_007.bam.bai 
IonXpress_008.bam.bai 
IonXpress_009.bam.bai 

for file in /home/cmccabe/example/folder/*.bam.bai; do 
mv -- "$file" "${file%%_[0-9][0-9][0-9]_*}.bam.bai 
done 

电流输出

IonXpress 
+0

除了在'mv'命令中缺少双引号字符,你是否尝试了一个常识选项,比如在循环中包含一个调试行,比如'echo mv - “$ file”“$ {file %% _ [0-9] [ 0-9] [0-9] _ *}。bam.bai“'? – Jdamian

+0

您的代码从新名称中删除'_009_'子字符串。 '$ {file %% _ [0-9] [0-9] [0-9] _ *}'为'IonXpress'扩展。 – Jdamian

回答

2

如果你有rename工具,那么你可以使用:

rename -n 's/^([^_]+_[^_]+)_.+$/$1.bam.bai/' *.bam.bai 

'IonXpress_007_MEVxz_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai' would be renamed to 'IonXpress_007.bam.bai' 
'IonXpress_008_MEVxx_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai' would be renamed to 'IonXpress_008.bam.bai' 
'IonXpress_009_MEVxy_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai' would be renamed to 'IonXpress_009.bam.bai' 

如果没有rename做,那么你可以通过这些文件使用循环和使用cut

for f in *.bam.bai; do echo mv "$f" "$(cut -d_ -f1-2 <<< "$f").bam.bai"; done 

mv IonXpress_007_MEVxz_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai IonXpress_007.bam.bai 
mv IonXpress_008_MEVxx_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai IonXpress_008.bam.bai 
mv IonXpress_009_MEVxy_R_2016_11_18_10_45_10_user_S5-00580-14-Medexome.bam.bai IonXpress_009.bam.bai 

删除echo之前mv一旦你s不满意输出。

+0

使用'rename'工具可以工作,但它只是将'stdout'中的文件重命名为不在目录中。谢谢 :)。 – Chris

+1

这是因为我使用'rename -n'进行空运行。只需使用'rename's /^([^_]+_[^_]+)_.+$/$ 1.bam.bai /'* .bam.bai'来重命名它们全部。 – anubhava

+1

谢谢,不熟悉'重命名',但感谢你介绍我和帮助:)。 – Chris

1

${file%%_[0-9][0-9][0-9]_*}删除任何字符,直到最左下划线字符(包括三位数字及其下划线)。因此,这扩大到IonXpress

相反,我的代码从右侧删除任何字符留到第二个下划线之后MEV子:

for file in /home/cmccabe/example/folder/*.bam.bai 
do 
     mv -- "$file" "${file%%_MEV*}".bam.bai 
done 

另一种选择是选择从文件名中的13个最左边的字符:

mv -- "$file" "${file::13}".bam.bai 
1

一个强大的方法来做到这一点将是:

#!/bin/bash 
mydir=/home/cmccabe/example/folder 
regex="^([^_]+_[^_]+)"     # Match a sequence of several not "_" 
             # followed by a "_" and by 
             # a second sequence of not "_". 

cd "$mydir"       # work only on files inside mydir. 
shopt -s nullglob      # Make the pattern null if no file. 

for file in ./[^.].bam.bai; do   # To avoid matching a renamed file. 
    [[ $file =~ $regex ]];    # test if the file match the regex. 
    f="./${BASH_REMATCH[1]}.bam.bai" 
    echo \ 
    mv "./$file" "$f"     # execute the rename. 
done 
相关问题