2016-11-24 15 views
1

具体的な名前をfile type.bam.bai)に変更しようとしていて、ファイル名に2番目のアンダースコア_の後にテキストを削除できません。現在のところ、最初のファイル_の後に名前が変更されたファイルが1つしか取得されない場合、他の2つのファイルは重複しているため削除されます。ありがとう、すばらしい休日があります:)。 /ホーム/ cmccabe /例のbashは、ディレクトリ内の特定のファイルタイプの名前を変更する

ファイル/フォルダ

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 

あなたがrename有用性を持っている場合は電流出力

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' 

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 

を削除すると、mvの前に削除されます出力に満足している。

+0

'rename'ユーティリティを使うと動作しますが、ディレクトリにない' stdout'のファイルの名前を変更するだけです。ありがとうございました :)。 – Chris

+1

私は 'rename -n'をドライランで使ったからです。それらの名前をすべて変更するには、 'rename 's /^([^_]+_[^_]+)_.+$/$ 1.bam.bai /' * .bam.bai'を使用してください。 – anubhava

+1

ありがとう、あなたは 'rename'に精通していませんが、私を紹介してくれてありがとう、ありがとう。 – Chris

1

${file%%_[0-9][0-9][0-9]_*}は、3桁の数字とその周囲のアンダースコアを含む、一番左のアンダースコアまで任意の文字を削除します。したがって、それは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 
関連する問題