2012-08-29 13 views
31

Chcę usunąć test.extra z wszystkich moich nazw plików w bieżącym kataloguusuwając część pliku pęczek plików

for filename in *.fasta;do 

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

    done 

ale o nie narzekanie założycielskich file.echo ma być upewnij się, że lista jest poprawna.

+0

Proszę podać kilka przykładów pełnych nazw jesteś przetwarzania. – unwind

+0

Czy chcesz usunąć "test.extra" na całym świecie Mam na myśli zastąpić wszystkie mecze, a nie tylko pierwsze? – hostmaster

Odpowiedz

33

przede wszystkim użycia 'sed -e' zamiast '\ e'

A ja proponuję zrobić to w ten sposób w bash

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

done 
+1

Moje nazwy plików zawierają spacje. Modyfikowanie powyższego i używanie poniższej linii działało dla mnie 'mv" $ filename "" $ {filename // test.extra /} "' – Ramesh

+1

Ramesh masz rację. jest typową i dobrą praktyką cytowanie rozszerzeń parametrów, szczególnie jeśli zawierają one nazwy plików – hostmaster

0

Po pierwsze, masz \e zamiast -e.

18

Spróbuj polecenia rename:

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

Co to jest polecenie "zmień nazwę"? Nie mogę znaleźć takiego, który obsługuje zastępczą składnię podobną do sed. – unwind

+0

Ta zmiana nazwy wersji jest w rzeczywistości częścią pakietu perl. – hostmaster

+2

@unwind True. Używam go tak często, że zapomniałem, że nie pochodzi z bash. Przepraszam! –

26

Spróbuj 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' 

Jest to bezpieczne w tym sensie, że mmv nic nie da, jeśli w przeciwnym razie nadpisze istniejące pliki (istnieją opcje wiersza polecenia, aby je wyłączyć).

14

Znam ten bieżnik jest stary, ale następujący oneliner, inspirowany z zatwierdzoną odpowiedź, bardzo mi pomogło;)

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

Tak, to jest poprawne, ale pomyśl przez chwilę, co tam jest katalog (a nie plik). – hostmaster

Powiązane problemy