28

45個のファイルの名前を変更する必要がありますが、1つずつ変更したくありません。これらはファイル名です:

chr10.fasta         chr13_random.fasta  chr17.fasta         chr1.fasta          chr22_random.fasta  chr4_random.fasta  chr7_random.fasta  chrX.fasta
chr10_random.fasta  chr14.fasta         chr17_random.fasta  chr1_random.fasta   chr2.fasta          chr5.fasta         chr8.fasta         chrX_random.fasta
chr11.fasta         chr15.fasta         chr18.fasta         chr20.fasta         chr2_random.fasta   chr5_random.fasta  chr8_random.fasta  chrY.fasta
chr11_random.fasta  chr15_random.fasta  chr18_random.fasta  chr21.fasta         chr3.fasta          chr6.fasta         chr9.fasta         
chr12.fasta         chr16.fasta         chr19.fasta         chr21_random.fasta  chr3_random.fasta   chr6_random.fasta  chr9_random.fasta
chr13.fasta         chr16_random.fasta  chr19_random.fasta  chr22.fasta         chr4.fasta          chr7.fasta         chrM.fasta

拡張子「.fasta」を「.fa」に変更する必要があります。私はそれを行うためにbashスクリプトを書き込もうとしています:

for i in $(ls chr*)

do

NEWNAME = `echo $i | sed 's/sta//g'`

mv $i $NEWNAME

done

しかし、それは機能しません。理由を教えていただけますか、それとも別の簡単な解決策を教えてください。

ありがとう!

4

3 に答える 3

36

ここでいくつかの間違い:

  • NEWNAME =スペースがないはずです。ここでbashはという名前のコマンドを探してNEWNAMEいますが、それは失敗します。
  • lsの出力を解析します。スペースのあるファイルがある場合、これは悪いことです。Bashは、glob演算子を使用してファイルのリストを作成できます*
  • あなたは逃げません"$i"そして"$NEWNAME"。それらのいずれかにスペースが含まれている場合、mvに対して2つの引数を作成します。
  • ファイル名がダッシュで始まる場合、mvそれはスイッチであると信じられます。--引数の処理を停止するために使用します。

試す:

for i in chr*
do
  mv -- "$i" "${i/%.fasta/.fa}"
done

また

for i in chr*
do
  NEWNAME="${i/%.fasta/.fa}"
  mv -- "$i" "$NEWNAME"
done

"は変数の末尾のみを"%{var/%pat/replacement}検索し、それを。に置き換えます。pat replacement

于 2012-01-17T17:41:17.097 に答える
13
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
于 2012-01-17T17:42:21.180 に答える
7

コマンドがある場合は、rename次のことができます。

rename .fasta .fa chr*.fasta
于 2012-01-17T17:45:48.050 に答える