特定の単語.fastaで終わるファイルを変更する方法

特定の単語.fastaで終わるファイルを変更する方法

「.fasta」で終わる特定の単語を含むファイルをどのように選択して変更できますか?

たとえば、「car」という単語を含むファイルを選択します。

find /home/user -name "*car*"

これは私に与える

/home/user/car.txt
/home/user/scar.fa
/home/user/cart.fa
/home/user/scart.fasta

ところで、どのように変えるか分からないので、みんな「.fasta」で終わりますね。

だから最終結果は

/home/user/car.fasta
/home/user/scar.fasta
/home/user/cart.fasta
/home/user/scart.fasta

答え1

オプションでasコマンドを使用することをお勧めしますrename-execfind

find /home/user -name "*car*" -exec rename 's/[^.]*$/fasta/' {} \;

[^.]*$ファイル名の末尾に点以外のすべての項目を一致させ、fasta拡張子に置き換えます。

命令がわからない場合は確認してくださいman rename

答え2

Bashソリューションについては、この概要を参照してください。部分文字列の削除

#!/bin/bash

for f in *car*; do
   [[ ${f##*.} == "fasta" ]] && continue

   f_no_ext="${f%%.*}"

   if [[ -e "${f_no_ext}.fasta" ]]; then
      echo "Not moving $f because it would clobber ${f_no_ext}.fasta"
      continue
   fi

   mv "$f" "${f_no_ext}.fasta"
done

exit

その後、すべてのファイルを繰り返し*car*て名前を.fasta拡張子に変更し、すでに.fastaで終わっているファイルはスキップします。他の解決策はこのステップを無視することができると思います。

if編集:ファイルの上書きを防ぐために、拡張子が.fastaのファイルがすでに存在することを確認するブロックを追加しました。たとえば、car.txtとcar.fastaがあるとします。

答え3

ループとコマンドを使用するmv別の方法:

find /home/user -type f -name "*car*" | while read f; do mv -v "$f" "${f%.*}.fasta"; done

関連情報