異なるファイルに基づいて複数のファイルの名前を変更する

異なるファイルに基づいて複数のファイルの名前を変更する

約300個のファイルを含むフォルダがあります。

PD26414b.fixedheader.hs37d5.cram
PD26414b.fixedheader.hs37d5.cram.crai
PD26415g.fixedheader.hs37d5.cram
PD26415g.fixedheader.hs37d5.cram.crai

ファイル名のID(PD26414b、PD26415g)をテキストファイルに保存したのと同じ元の名前に変更したいと思います。

head names.homologs.txt
PD26414b SAMEA3471115
PD26415g SAMEA3471120
PD26433c SAMEA3471126
PD26429d SAMEA3471130

したがって、PD26414bの同族体名はSAMEA3471115です。

私が望むファイル名は

SAMEA3471115.fixedheader.hs37d5.cram
SAMEA3471115.fixedheader.hs37d5.cram.crai
SAMEA3471120.fixedheader.hs37d5.cram
SAMEA3471120.fixedheader.hs37d5.cram.crai

Linuxでこれを行う方法はありますか? sedとmvの組み合わせでなければならないことを知っていますが、正確なコマンドがわかりません。

ベストアンサー1

名前変更ユーティリティがインストールされていない場合は、いつでも独自にロールアウトできますが、追加機能はありません。

perl -le 'local $/;
  my %h = <STDIN> =~ /^(.*) (.*)$/mg;
  rename $_, s/^[^.]+/$h{$&}/r
    for @ARGV;
' *cram* < names.homologs.txt

Pearlの標準入力にあるソースファイルを使用して名前マップハッシュを初期化し、それを後続の名前変更コマンドに適用できます。


ファイル名に改行文字がないため、sedを使用してこれを実行できます。

sed -Ee '
  1i\
h
  s|\S+|s/^[.][/]&[.]/|
  s||.\\/&./;ta|2
$a\
:a\
G\
s/(.*)\\n(.*)/\\2 \\1/
' names.homologs.txt > genMvPairs

  find . -maxdepth 1 -type f -name '*.cram*' |
  sed -Ef genMvPairs - | xargs -n2 -t mv -f

おすすめ記事