Unix 이름 바꾸기 명령을 사용하여 일괄적으로 파일 이름을 바꾸는 방법은 무엇입니까?

Unix 이름 바꾸기 명령을 사용하여 일괄적으로 파일 이름을 바꾸는 방법은 무엇입니까?

이름이 다음과 같은 파일이 있습니다.

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";
}

관련 정보