2012-08-29 4 views
31

Entfernen ich test.extra von allen meinen Dateinamen in dem aktuellen Verzeichniseinen Teil des Dateinamen einer Reihe von Dateien

for filename in *.fasta;do 

     echo $filename | sed \e 's/test.extra//g' 

    done 

aber es beschwert sich über nicht Gründungs ​​file.echo entfernen will, ist zu sein sicher, dass es korrekt aufgelistet ist.

+0

Bitte einige Beispiele für die vollständigen Dateinamen liefern Sie verarbeiten. – unwind

+0

Möchten Sie "test.extra" global entfernen? Ich meine, ersetzen Sie alle Übereinstimmungen, und nicht nur die erste? – hostmaster

Antwort

33

Vor allem Gebrauch '-e sed' statt '\ e'

Und ich würde vorschlagen, dass Sie es auf diese Weise in bash tun

for filename in *.fasta; do 
    [ -f "$filename" ] || continue 
    mv "$filename" "${filename//test.extra/}" 

done 
+1

Meine Dateinamen haben Leerzeichen. Das Ändern der obigen und die Verwendung der folgenden Zeile funktionierte für mich 'mv" $ filename "" $ {filename // test.extra /} "' – Ramesh

+1

Ramesh du hast Recht. Es ist gängige Praxis, Parametererweiterungen zu zitieren, vor allem, wenn sie Dateinamen enthalten. – hostmaster

0

Für eine Sache haben Sie eine \e anstelle von -e.

18

Versuchen Sie, den rename Befehl:

rename 's/test.extra//g' *.fasta 
+0

Was 'Rename' Befehl ist das? Ich kann keine finden, die sed-artige Ersatzsyntax unterstützt. – unwind

+0

Diese Umbenennungsversion ist eigentlich ein Teil des Perl-Pakets. – hostmaster

+2

@unwind Wahr. Ich benutze es so oft, dass ich vergessen habe, dass es nicht bash ist. Es tut uns leid! –

26

Versuchen rename "extra.test" "" *

$ find 
./extra.test-eggs.txt 
./extra.testbar 
./fooextra.test 
./ham-extra.test-blah 

$ rename "extra.test" "" * 
$ find 
./-eggs.txt 
./bar 
./foo 
./ham--blah 
2
$ mmv '*test.extra*.fasta' '#1#2.fasta' 

Dies ist sicher in dem Sinne, dass mmv nichts tun wird, wenn es sonst vorhandene Dateien überschreiben würde (es gibt Befehlszeilenoptionen, um dies auszuschalten).

14

Ich weiß, das Profil alt ist, aber die folgenden oneliner, aus der validierten Antwort inspiriert, haben mich sehr geholfen;)

for filename in ./*; do mv "./$filename" "./$(echo $filename | sed -e 's/test.extra//g')"; done 
+0

Ja, das ist richtig, aber denken Sie eine Minute lang darüber nach, wo sich ein Verzeichnis (keine Datei) befindet. – hostmaster

Verwandte Themen