Zmienianie nazw plików w systemie Linux za pomocą wyrażenia regularnego

9

Miałem grupę plików, których nazwę chciałbym konsekwentnie zmieniać, pliki mają takie nazwy

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

I chciałem, aby były małymi, yyyymmdd, rozszerzeniem .log

"system.20090101.log"
"something.20090101.log"
Osama ALASSIRY
źródło

Odpowiedzi:

14

W tym celu pisałem skrypty Perla, dopóki nie odkryłem polecenia zmiany nazwy.

Akceptuje wyrażenie regularne w Perlu, aby zmienić nazwę:

w tym celu wpisałem tylko dwa polecenia:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Jednak w przypadku niektórych dystrybucji renamenie ma tej funkcji (zobacz stronę podręcznika) i może być konieczne zainstalowanie perl-renamelub prename.

Osama ALASSIRY
źródło
bardzo ładna odpowiedź
Judioo
8
Uwaga, niektóre dystrybucje wysyłają bezwartościowe polecenie zmiany nazwy. Sprawdź, która z nich jest pierwsza.
derobert
Wiedziałem, mmvale ostatecznie dzięki renameniemu mogę skorzystać z mocy wyrażenia regularnego
Ludovic Kuty
5
W Arch Linux to jest perl-rename.
Oleh Prypin
6

Ponieważ nie mam polecenia zmiany nazwy, polegam na tym:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
Franz Bettag
źródło
5

mmv to standardowe narzędzie linuksowe do przenoszenia / zmiany nazw wielu plików. Jest dostępny z repozytoriów dla większości dystrybucji. W powyższym przykładzie możesz wykonać:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Aby uzyskać więcej informacji, przeczytaj ten artykuł o debaday lub stronę podręcznika man .

Hamish Downer
źródło
5

renameutil nie jest bardzo „standardowy”. Każda dystrybucja jest dostarczana z innym renamenarzędziem. Na przykład tutaj, na Gentoo, renamepochodzi z sys-apps/util-linuxpakietu i nie obsługuje wyrażeń regularnych.

Sugeruje się mmv, że Hamish Downer jest przydatny, szczególnie do użytku w skryptach.

Z drugiej strony, w ogólnym przypadku, możesz chcieć zmienić nazwy . Ma qmvi qcppolecenia, które otworzą wybrany edytor tekstów (moje preferencje: Vim) i umożliwią edycję tam docelowych nazw plików. Po zapisaniu i zamknięciu edytora qmv/ qcpzmieni całą nazwę.

Zarówno mmvi qmvjest wystarczająco inteligentny, aby zmienić nazwę plików w odpowiedniej kolejności, a także do wykrywania okrągłe Zmienia nazwę i automatycznie dokonać tymczasowego pliku w razie potrzeby.

Denilson Sá Maia
źródło
Na Gentoo możesz także zainstalować sys-apps/renamepakiet, który da ci renamexmzmianę nazwy wyrażeń regularnych, a także masowe wielkie / małe litery i inne fajne rzeczy.
radicand
1

Aby być uczciwym:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

daje ten wynik:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Ale:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

daje właściwą wydajność:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

zamieniając przełącznik {-n} na {-v}

fpba
źródło
1

Stworzyłem mały skrypt bash, aby to zrobić:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done
bjarkig82
źródło
Ogólnie parsowanie lsdanych wyjściowych nie jest najlepszym pomysłem. Losowe wyszukiwanie wyciągnęło ten długi tekst na Unixie. SE dla twojej rozrywki. | Ponadto twoja odpowiedź lepiej pasowałaby do pytania ztr '[:upper:]' '[:lower:]'
HBruijn