Zmienianie nazw plików systemu Linux, które przypadkowo mają wiele rozszerzeń .mp3

7

Spieprzyłem i przypadkowo mam kilka plików z rozszerzeniem .mp3.mp3.mp3.mp3

Jak mogę je zmienić, rekurencyjnie - i w wielu katalogach - aby ustawić je jako sprawiedliwe .mp3?

użytkownik365967
źródło

Odpowiedzi:

16

Istnieje dość proste rozwiązanie, które polega na odcięciu wszystkiego od pierwszego „.mp3”, a następnie ponownym dodaniu „.mp3”. Więc:

for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done
seumasmac
źródło
4

Korzystanie z renamenarzędzia dostarczanego z perlem (może być znane jako perl-renamew niektórych systemach) i powłoki z **( shopt -s globstarmiędzy innymi zsh lub bash ):

rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
Hobbs
źródło
2

Za pomocą findpolecenia bashi kreatywnych skryptów można to magicznie wyczyścić. Poniższe skrypty zostały przetestowane w systemie Mac OS X 10.9.5, ale powinny również działać dobrze w systemie Linux. Najpierw uruchom to jako „rozruch próbny”, aby upewnić się, że celujesz we właściwe pliki:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    echo "mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3"
  done

Najpierw należy zmienić, /path/to/your/filesaby dopasować rzeczywistą ścieżkę do plików podlegających usterce w systemie. Należy również pamiętać, ostatni wiersz, który jest echoo mvpoleceniu (MOVE). Robię to, aby upewnić się, że skrypt celuje we właściwe pliki.

Podstawowa findlogika jest następująca:

find '/path/to/your/files' -type f -name '*.mp3.mp3*'

Co w zasadzie oznacza: „Znajdź wszystkie pliki na ścieżce /path/to/your/files, które w rzeczywistości są plikami (a nie katalogami), które mają pasujący wzorzec nazw plików *.mp3.mp3*. To powinno przechwycić wszystkie / wszystkie pliki, które mają więcej niż jeden .mp3dołączony do nich; .mp3.mp3, .mp3.mp3.mp3, .mp3.mp3.mp3.mp3, .mp3.mp3.mp3.mp3.mp3, Itd ...

Skrypt nie zadaje sobie trudu radzenia sobie z plikami, które mają tylko poprawność, .mp3co jest zdecydowanie zaletą pod względem szybkości, jeśli masz tylko niewielki podzbiór plików, .mp3.mp3.mp3.mp3zamiast konieczności zmiany nazwy wszystkich plików .mp3.

Kiedy więc uruchomisz, powinieneś zobaczyć listę „suchych” mvpoleceń, które naprawią twój problem: Znajdź wszystkie te wiele .mp3plików i zmień ich nazwę na właściwą, pojedynczą .mp3.

Teraz, gdy to działa dobrze, po prostu uruchom ostatni skrypt w następujący sposób:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3
  done

Zauważ, że ostatni wiersz to aktualne, funkcjonalne mvpolecenie. Po uruchomieniu tej wersji skryptu cały katalog zostanie przeszukany pod kątem wielu .mp3plików, a następnie uruchomi pełne mvpolecenie, aby rozwiązać problem.

JakeGould
źródło
1
+1, twoja odpowiedź jest lepsza niż moja. ;-)
Sirex