Masowa zmiana nazw plików w bashu

Uwieczna bolączka, potrzeba zmienić masowo nazwy dużej ilości plików. I to nie prosta zmiana rozszerzenia na inne, tylko coś poważniejszego. W tym celu wykorzystamy moc edytora sed i basha.

Przykładowo aby zmienić w nazwie pliku „DS9″ na „Deep Space Nine” należy odpalić

for file in *.avi ; do echo \"$file\" `echo \"$file\" | sed 's/DS9/Deep Space Nine/i'` | xargs mv  ; done

Krótkie wyjaśnienie co i dlaczego:

  • sed ‚s/DS9/Deep Space Nine/i’ jest tutaj naszym robolem wykonującym pracę, zamienia tekst (polecenie s) bez zwracania uwagi na wielkość liter (opcja i). Można tutaj stosować wyrażenia regularne!
  • Pierwsze echo pipe’ujemy do xargs, drugie do seda. Pierwsze będzie zawierało output drugiego
  • Cała zabawa z przepuszczaniem przez polecenie xargs jest konieczna ze względu na możliwość wystąpienia w nazwach plików spacji oraz znaków interpretowanych przez powłokę (nawiasów, znaków dolara itd) co spowodowałoby błąd składni.
  • Bez podwójnego apostrofa („) xargs nie rozóżniłby gdzie zaczyna się kolejny argument i źle przekazał parametry do mv

Pozdrowienia dla http://lab.artlung.com/unix-batch-file-rename/. Moja wersja jest zapożyczona stamtąd, ulepszona jedynie o obsługę uciążliwych nazw plików.

Zostaw komentarz