2009-09-08 14 views
61

przepraszam za właściwie głupie pytanie, ale jestem całkiem początkującym. mam mnóstwo plików, które wyglądają tak:zmień część nazwy pliku

DET01-ABC-5_50-001.dat 
... 
DET01-ABC-5_50-0025.dat 

i chcę, żeby wyglądać tak:

DET01-XYZ-5_50-001.dat 
... 
DET01-XYZ-5_50-0025.dat 

w jaki sposób mogę to zrobić? Wypróbowałem kilka rzeczy z tego forum, ale wydaje mi się, że popełniłem błąd. Dzięki za pomoc!

Odpowiedz

123

Istnieje kilka wariantów polecenie zmiany nazwy, w Twoim przypadku może być tak proste, jak

rename ABC XYZ *.dat 

Możesz mieć wersję, która zaczyna regex Perl;

rename 's/ABC/XYZ/' *.dat 
+0

+1 najprostszy sposób – rangalo

+0

dzięki milion! To było łatwe (jeśli wiesz jak ;-)) –

+2

Witamy w stackoverflow! –

1

Lubię to robić z sed. W twoim przypadku:

for x in DET01-*.dat; do 
    echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/' 
done | sh -e 

Najlepiej najpierw pominąć część "sh -e", aby zobaczyć, co zostanie wykonane.

+0

Może robię coś nie tak, ale to nie robi nic dla moich plików? –

+0

Próbujesz z lub bez "sh -e"? Jeśli próbujesz bez tego nie powinno. Po prostu wypisuje, co zostanie wykonane (linie "mv -v ... ..."), aby sprawdzić, czy wszystko jest w porządku. Jeśli podoba Ci się to, co widzisz, dodaj "sh -e". – stribika

6

Coś takiego zrobi to. Pętla for może wymagać modyfikacji w zależności od nazw plików, które chcesz przechwycić.

for fspec1 in DET01-ABC-5_50-*.dat ; do 
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/') 
    mv ${fspec1} ${fspec2} 
done 

Zawsze należy przetestować te skrypty na kopii swoich danych, nawiasem mówiąc, w zupełnie różnych katalogach.

+0

dla osx to wszystko. zmienianie nazwy wygląda fajnie, ale instalacyjna zmiana nazwy wydaje się instalować skrypt perla, który nie działał zgodnie z powyższym przykładem. Niektóre metody googlowania wskazywały, że zmiana nazwy nie jest dostępna we wszystkich wersjach linuxowych i że istnieje zmienna wersja perl. Miałem około 10 minut, próbując rozdzielić różnice i zdecydować - wiesz, że ta odpowiedź jest po prostu łatwa :). – j03m

1

Wszystkie te odpowiedzi są proste i dobre. Zawsze jednak lubię dodawać tryb interaktywny do tych skryptów, aby znaleźć fałszywe alarmy.

jeśli [[-n $ inInteractiveMode]]
następnie
    echo -e -n "$ StaraNazwaPliku => $ NowaNazwaPliku \ nCzy chcesz zrobić tę zmianę [Y/n]?"
    odczytu uruchomić

    [[-z $ run || "$ run" == "y" || "$ Run" == "Y"]] & & mv "$ StaraNazwaPliku" "$ NowaNazwaPliku"
fi

Albo zrobić interaktywny tryb domyślny i dodać flagę force (-f | force) do automatycznych skryptów lub jeśli czujesz się odważny. A to nie spowalnia zbyt wiele: domyślną odpowiedzią jest "tak, chcę zmienić nazwę", więc możesz po prostu nacisnąć klawisz Enter przy każdym monicie (z powodu testu `` -z $ run \.

77
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done 

Nie rename lub sed potrzebne. Po prostu bash parameter expansion.

+5

Jeśli nazwy plików zawierają spacje, należy użyć cudzysłowu. Zobacz fragment poniżej ... 'dla pliku w * .dat; do mv "$ plik" "$ {plik // ABC/XYZ}"; done' –

+0

Działa świetnie na OSX –

Powiązane problemy