2017-11-21 10 views
0

私は現在、複数のファイル名を同時に変更するためのbash正規表現を取得しようとしています。ここではファイル名は次のとおりです。bashでのサブストリングの削除

a_001_D_xy_S37_L003_R1_001.txt 
a_001_D_xy_S37_L003_R2_001.txt 
a_002_D_xy_S37_L006_R1_001.txt 
a_002_D_xy_S37_L006_R2_001.txt 
a_003_D_xy_S23_L003_R1_001.txt 
a_003_D_xy_S23_L003_R2_001.txt 

私は、結果としてこれをしたい:

a_002_D_xy_R1.txt 
a_002_D_xy_R2.txt 
... 

は、私が唯一の終わりに001.txt *を有するものを変更したいです。まず、_S .._ L00を削除します。ファイル名には001、最後には001となります。私はこの手順を2つに分割しました:

for file in *001.txt; 
do 
echo ${file#_S.._L..6} 
done 

このループはすでに機能しません。第二の代替として、私が試した:

for file in *001.fastq.gz; 
do 
echo ${file/_S.._L00./} 
done 

が、ファイル名は再び変更されません。 (私は結果を見るためにここでエコーを使用しています。動作すればmv ${file} ${regularexpression}と置き換えます) 助けてくれてありがとう!

+0

期待される出力のように、文字列 'a_002_D_tR_R1'にどうやって到着しますか? – Inian

+0

'$ {file#...'と '$ {file/...'は**正規表現ではありません**。 –

+0

https://stackoverflow.com/questions/7450818/rename-all-files-in-directory-from-filename-h-to-filename-halfの可能な複製 – tripleee

答えて

-1

まず、ファイルの数(n)を決定する必要があります。

n=$(ls *_001.txt | wc -l) 

functionRename(){ 

    for((i=1; i <=n; i++)) 
    do 
    file=$(ls *_001.txt | head -n $i | tail -n 1) 
    mv "${file}" "${file%_S??_*}${file#???????????????????}" 
    file2=$(ls *_001.txt | head -n $i | tail -n 1) 
    mv "${file2}" "${file2%_001*}.txt" 
    done 
} 

functionRename 
+0

これは不適切なスクリプト作成のコンパイルのように読まれます。少なくとも最悪の犯罪を取り除くにはhttp://shellcheck.net/を試してください。 – tripleee

+0

ご意見ありがとうございます。どういう違反行為があるのか​​説明してください。私は誰をも怒らせようとはしなかった。 –

+0

何も個人的ではありません! ( - :リンクをクリックしてスクリプトに貼り付けると、引用問題と移植性のエラーについて教えてくれるだろうが、ファイルリストからエントリを繰り返し抜くという非常に厄介で非効率的な反パターンについては警告しないと思うワイルドカードを使ったsimpyのループの例 – tripleee

1

異なるフィールドがたくさん必要であることを考慮すると、ファイル名を分割して、必要に応じて再構成する方がよい場合があります。

元のファイル名を_に分割して作成した配列を使用することをお勧めします。次に、あなたが望むフィールドを使って新しい名前を再構築するだけです。 echoコマンドはちょうどデバッグのためのものです

for file in *001.txt; do 
     echo "FILE: $file" 

     IFS='_' read -r -a fileFields <<< "$file" 
     echo "FILE FIELDS: " 
     for index in "${!fileFields[@]}"; do 
      echo "- $index ${fileFields[index]}" 
     done 

     fileName="${fileFields[0]}_${fileFields[1]}_${fileFields[2]}_${fileFields[3]}_${fileFields[-2]}.txt" 
     echo "NEW FILE NAME: $fileName" 
     # mv $file $fileName 
    done 

あなたは、コードを理解すれば、あなたはそれらをすべて削除することができます。

しかし、実際にBASH式を使用して文字列を分割する必要がある場合は、 Extracting part of a string to a variable in bashの投稿を確認するか、BASH cheat sheetをご覧ください。

関連する問題