Как переименовать файлы в пакете с 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

Но почему этот Unix управляет не, работают?

$ rename 's/indel/snp/' *.sam
6
задан 30.07.2014, 11:33

4 ответа

Поскольку Вы используете несправедливость, переименовывают программу. Это - правильное.

5
ответ дан 07.12.2019, 15:43
ls -1 | while read item
do
  mv $item $(echo $item|sed -e s/.indel./.snp./g);
done
2
ответ дан 07.12.2019, 15:43

"Нормальное" rename утилита (часть util-linux) берет 3 или больше аргумента (как упомянуто в TFM..)

rename FROM TO filespec...

Таким образом Вы (вероятно), ищете:

rename .indel. .snp. *.sam

Протестируйте это на каталоге царапины сначала, поскольку можно использовать другую реализацию rename.

Или проверьте страницу справочника. кашель

4
ответ дан 07.12.2019, 15:43

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";
}
0
ответ дан 07.12.2019, 15:43

Теги

Похожие вопросы