Mam muzykę GB na moim dysku twardym sformatowanym w EXT4. Chcę przenieść te pliki na partycję HDD sformatowaną w systemie plików FAT. Jednak nie mogę przenieść większości moich plików, ponieważ mają one w nazwach „:” (na przykład „Akt 2: .....” w przypadku oper). Czy w wierszu polecenia można zmienić nazwę wszystkich moich plików z „XXXX: XXXX” na „XXXX-XXXX”?
źródło
find .
nazwy podkatalogu poprzedza się jego zawartość. Więc jeśli masz plik/1:/2:
najpierw/1:/
zostanie zmieniona na/1-/
. Teraz nie możesz zmienić nazwy/1:/2:
na,/1-/2-
ponieważ/1:/2:
nie istnieje.find . -type d -readable -writable -exec rename 's|:|-|g' {} \;
a następnie plików:find . -type f -readable -writable -exec rename 's|:|-|g' {} \;
for i in {1..20}; do find . -maxdepth $i -mindepth $i -name "*:*" -exec rename 's|:|-|g' {} \;; done
. Zmień 20 na maksymalną głębokość reż. Struktura. Nie musi być dokładny - może być większy. Zajmie to jednak czas, jeśli zostanie ustawiony na bardzo dużą liczbę.Nie jestem teraz w mojej maszynie z Linuksem, więc mogę podać tylko przybliżone informacje.
Linux ma narzędzie wiersza polecenia o nazwie,
rename
które działa z innymi danymi wejściowymi, wyrażeniami regularnymi lub wyrażeniami regularnymi. Powinieneś być w stanie użyć tego wraz z wyrażeniem regularnym, takim jak „s /: / - /” na swoich plikach, aby uzyskać pożądaną nazwę.Na wszelki wypadek zrób to małymi partiami i / lub pierwszy test z symulacją (zmiana nazwy ma flagę, która podaje tylko starą nazwę i nową nazwę pliku bez faktycznej zmiany nazwy - użyj tego do sprawdzenia w pierwszej kolejności)
źródło
Jest to rozwiązanie w Pythonie, które obsługuje przypadek, w którym pliki niekoniecznie znajdują się w tym samym katalogu.
rootdir
do rozważanego katalogu najbardziej zewnętrznego (użyj pełnej nazwy ścieżki zaczynającej się od /. Nie wolno używać skrótów ani zmiennych env, takich jak ~). Nie trzeba umieszczać \ przed znakami specjalnymi - na przykład, jeśli najbardziej zewnętrzny katalog to /.../Mój dysk twardy,rootdir = "/.../My HDD"
NIE umieszczajrootdir = "/.../My\ HDD"
(zwróć uwagę na „s”). (Mówię to wyraźnie tylko dlatego, że możesz nie znać języka Python. Nie lekceważ zamierzony.]logfile
żądaną lokalizację pliku dziennika. Na koniec plik ten będzie zawierał listę plików o zmienionych nazwach - do wykorzystania w przyszłości.python rename.py
.Ostrzeżenie: wykonaj test na małej próbce, zanim zaryzykujesz całą GB muzyki.
Szczegóły: zmiana nazwy odbywa się od najbardziej wewnętrznych plików na zewnątrz.
źródło
Zdaję sobie sprawę, że to bardzo stary post. Rekurencyjne rozwiązanie AeroGT80 jest bardzo dokładne, ale działa dość wolno. Pracowałem przez około pół godziny na wolniejszym serwerze, a wykonałem tylko około połowy - myślę, że było to około 73 000 plików w około 300 podkatalogach.
Poniższe rozwiązanie będzie działać znacznie szybciej (działa na wszystkich plikach w katalogu, zamiast na każdym pliku jeden po drugim - przy użyciu nierekurencyjnego rozwiązania AeroGT80). Jedyny problem polega na tym, że zajmuje on tylko jeden katalog głęboko (więc nie jest w pełni rekurencyjny, jak jego rozwiązanie), ale jestem pewien, że można go łatwo zmodyfikować.
źródło