Jak zmieniać nazwy plików wsadowo za pomocą polecenia zmiany nazwy Unix?

6

Mam pliki, których nazwy wyglądają tak:

Sim1-2_40.36.chr20_sb.foo.indel.novoalign.sam
Sim1-2_40.36.chr20_sb.foo.indel.bwa.sam

Co chcę zrobić, to wymienić wszystko indelze snpw nazwach plonowanie

Sim1-2_40.36.chr20_sb.foo.snp.novoalign.sam
Sim1-2_40.36.chr20_sb.foo.snp.bwa.sam

Ale dlaczego to polecenie unixowe nie działa?

$ rename 's/indel/snp/' *.sam
Neversaint
źródło
Nie widzę dokumentacji wspominającej obsługę nazw komend takich jak „s / indel / snp /”, którego narzędzia do zmiany nazwy używasz?
nos
Wygląda na to, że OP odnosi się do man.cx/prename
jamessan
2
Co doesn't workz tym poleceniem? Czy pojawia się błąd? Czy to nie zmienia nazw plików? Coś innego?
jamessan,

Odpowiedzi:

5

Ponieważ używasz niewłaściwego programu zmiany nazwy. To jest właściwe.

tchrist
źródło
1
Jeśli nie ma go w CPAN ( 1 , 2 , 3 , 4 , 5 ), równie dobrze może nie istnieć.
daxim,
1
@daxim: CPAN nienawidzi programów.
tchrist
1
Jesteś nierozsądny.
daxim,
4

„Normalne” renamenarzędzie (część util-linux) pobiera 3 lub więcej argumentów (jak wspomniano w TFM ..)

rename FROM TO filespec...

Dlatego (prawdopodobnie) szukasz:

rename .indel. .snp. *.sam

Przetestuj to najpierw w katalogu scratch, ponieważ być może używasz innej implementacji rename.

Lub sprawdź stronę podręcznika. kaszel

Szymon, Szymek
źródło
2
+1 za niezwłoczne przejście do wyrażeń regularnych. :) Ale warto kropki wokół indeli snptak drogi jak blah.stuffindelsomeotherstuff.xnie ulegają zmianie, jak również.
cHao
Słuszna uwaga. Dodany.
Simon
2
ls -1 | while read item
do
  mv $item $(echo $item|sed -e s/.indel./.snp./g);
done
n0pe
źródło
Dlaczego ls -1 | while read itemzamiast for item in *.sam?
cHao
@ user280476: twój kod zrobi dziwne rzeczy, jeśli masz pliki ze spacjami w nazwie.
… Lub duża liczba plików.
JdeBP
0

renamenie wykonuje sedstylowych zamian. Ten bardzo krótki skrypt Perla pozwoli Ci 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";
}
Blrfl
źródło