Archiwum tagów: bash

Unix/HP-UX: Wyszukiwanie plików zawierających konkretny tekst

Wyszukiwanie plików zawierających konkretny tekst na unixie, za pomocą grepa:

grep -H "szukany string"

Opcja -H powoduje wyświetlenie nazwy pliku w którym było trafienie.
Niestety na HP-UX zdarza się że jest dostępny grep w starszej wersji, bez wsparcia dla opcji -H, wtedy można sobie poradzić sposobem:

find . -exec grep -l "szukany string" {} \;

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.