SEDはディレクトリに部分的なファイル名を保持します。

SEDはディレクトリに部分的なファイル名を保持します。

私はMainDirectory/hundreds_of_subdirectories/thousands_of_fastas構造を持っています。基本となる各ファスタ(生物情報ファイル形式)について、ファイルの特定の部分のみを維持するために、ファイル名とファイルの最初の行を変更してみました。

したがって、次のテキストはファイル名とファイル名を構成します。

947-length-1150-cov-1000|contig:JAECWU010000213.1|slice:817050-818200|uce:uce-1452|match:817550-817700|orient:{'+'}|probes:4.unaligned.fasta

になる:

uce-1452.unaligned.fasta

私が試したファイルの最初の行を編集するには

sed '1 s/^[^|uce-]*(|uce-[0-9]).*/\1/' hundreds_of_subdirectories/*

しかし、チケットではありません...

その後、ある種のループを混乱させる...

for i in *\*.unaligned.fasta; do sed -E 's/^[^|uce-]*(|uce-[0-9]).*/\1/'; done

ファイル名の場合はrename代わりに使用することをお勧めsedしますがsed、次のことを試しました。

for x in hundreds_of_subdirectories/thousands_of_fastas*unaligned.fasta; do
    echo $x | sed -r 's/^[^|uce-]*(|uce-[0-9]).*/mv' -v "\0" "|uce-[0-9].*/\1/.unaligned.fasta"/
done

私は木に向かって吠えましたか?ありがとうございます!

ベストアンサー1

findPerlユーティリティを使用してrename使用できます。

find MainDirectory -type f -name '*.unaligned.fasta' \
  -exec rename -v -d 's/.*:(uce-\d+).*/$1.unaligned.fasta/' {} +

これは各パスのファイル名部分(options -d)のみを変更し、ターゲットファイル名がすでに存在する場合はファイル名を変更しないでください。-v詳細でない出力のオプションを削除します。

おすすめ記事