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
?
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
Korzystanie z rename
narzędzia dostarczanego z perlem (może być znane jako perl-rename
w niektórych systemach) i powłoki z **
( shopt -s globstar
między innymi zsh lub bash ):
rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
Za pomocą find
polecenia bash
i 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/files
aby dopasować rzeczywistą ścieżkę do plików podlegających usterce w systemie. Należy również pamiętać, ostatni wiersz, który jest echo
o mv
poleceniu (MOVE). Robię to, aby upewnić się, że skrypt celuje we właściwe pliki.
Podstawowa find
logika 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 .mp3
dołą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ść, .mp3
co jest zdecydowanie zaletą pod względem szybkości, jeśli masz tylko niewielki podzbiór plików, .mp3.mp3.mp3.mp3
zamiast konieczności zmiany nazwy wszystkich plików .mp3
.
Kiedy więc uruchomisz, powinieneś zobaczyć listę „suchych” mv
poleceń, które naprawią twój problem: Znajdź wszystkie te wiele .mp3
plikó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 mv
polecenie. Po uruchomieniu tej wersji skryptu cały katalog zostanie przeszukany pod kątem wielu .mp3
plików, a następnie uruchomi pełne mv
polecenie, aby rozwiązać problem.