
次のような名前のファイルがあります:
Sim1-2_40.36.chr20_sb.foo.indel.novoalign.sam
Sim1-2_40.36.chr20_sb.foo.indel.bwa.sam
私がやりたいのは、名前の中のindel
すべてを置き換えることです。snp
Sim1-2_40.36.chr20_sb.foo.snp.novoalign.sam
Sim1-2_40.36.chr20_sb.foo.snp.bwa.sam
しかし、なぜこの UNIX コマンドは機能しないのでしょうか?
$ rename 's/indel/snp/' *.sam
答え1
間違った名前変更プログラムを使用しているためです。 これが正しいものです。
答え2
「通常の」rename
ユーティリティ (の一部util-linux
) は、3 つ以上の引数を取ります (TFM で説明されているように)。
rename FROM TO filespec...
したがって、あなたが(おそらく)探しているのは次のものです:
rename .indel. .snp. *.sam
の別の実装を使用している可能性があるため、最初にスクラッチ ディレクトリでこれをテストしますrename
。
または、man ページを確認してください。 咳
答え3
ls -1 | while read item
do
mv $item $(echo $item|sed -e s/.indel./.snp./g);
done
答え4
rename
スタイルの置換は行いませんsed
。この非常に短い Perl スクリプトを使用すると、次の操作を実行できますregmv *.sam s/indel/snp/
。
#!/usr/bin/perl -w
#
# regmv - Rename files using a regular expression
#
# This program renames files by using a regular expression to
# determine their new name.
#
# Usage: regmv file [file ...] regexp
#
# $Id: regmv,v 1.1 1998/10/14 17:07:55 blrfl Exp $
#
sub at_clean()
{
my $message = $@;
$message =~ s|\s+at /.*$||s;
return $message;
}
(@ARGV > 1)
|| die "Usage: regmv [options] file [file ...] regexp\n";
my $expr = pop @ARGV;
$_ = 'SomeValue';
eval "\$_ =~ $expr";
die "Yuck: " . at_clean() if $@;
foreach (@ARGV)
{
my $old = $_;
eval "\$_ =~ $expr";
next if $_ eq $old;
(rename $old, $_)
|| die "Rename failed: $!\n";
}