
이름이 다음과 같은 파일이 있습니다.
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
그런데 왜 이 유닉스 명령이 작동하지 않는 걸까요?
$ rename 's/indel/snp/' *.sam
답변1
잘못된 이름 바꾸기 프로그램을 사용하고 있기 때문입니다. 이것이 맞습니다.
답변2
"일반" rename
유틸리티( 의 일부 util-linux
)는 3개 이상의 인수를 사용합니다(TFM에서 언급한 대로..).
rename FROM TO filespec...
따라서 당신은 (아마도) 다음을 찾고 있습니다:
rename .indel. .snp. *.sam
의 다른 구현을 사용할 수 있으므로 먼저 스크래치 디렉토리에서 이를 테스트하십시오 rename
.
아니면 매뉴얼 페이지를 확인해보세요. 기침
답변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";
}