Mam pliki z takimi nieprawidłowymi znakami
009_-_�%86ndringshåndtering.html
Jest to miejsce, w Æ
którym coś poszło nie tak w nazwie pliku.
Czy istnieje sposób, aby po prostu usunąć wszystkie nieprawidłowe znaki?
lub może tr
być jakoś wykorzystany?
echo "009_-_�%86ndringshåndtering.html" | tr ???
Odpowiedzi:
Jednym ze sposobów byłoby zastosowanie sed:
file
Oczywiście zastąp swoją nazwą pliku. Zastąpi to wszystko, co nie jest literą, cyfrą, kropką, podkreśleniem lub myślnikiem znakiem podkreślenia. Możesz dodawać lub usuwać znaki, aby zachować, jak chcesz, i / lub zmienić znak zastępczy na cokolwiek innego lub nic.źródło
f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_}
Zakładam, że jesteś na Linux-ie, a pliki zostały utworzone na Windowsie. Linux używa UTF-8 jako kodowania znaków dla nazw plików, podczas gdy Windows używa czegoś innego. Myślę, że to jest przyczyną problemu.
Użyłbym „convmv”. To narzędzie może konwertować nazwy plików z jednego kodowania znaków na inny. W Europie Zachodniej jeden z nich zwykle działa:
Jeśli musisz zainstalować go na Linuksie opartym na Debianie, możesz to zrobić, uruchamiając:
Działa dla mnie za każdym razem i odzyskuje oryginalną nazwę pliku.
Źródło: LeaseWebLabs
źródło
Save the current file in Word 97-2004 format\sco.workflow
który został utworzony na moim komputerze Mac (za pośrednictwem pakietu Microsoft Office), a powyższe kodowania nie mają żadnego efektu.--notest
opcją zmiany nazwy plików.Zakładam, że masz na myśli, że chcesz przejść przez system plików i naprawić wszystkie takie pliki?
Oto jak bym to zrobił
Znalazłoby to wszystkie pliki ze znakami innymi niż ascii i zastąpiłoby je znakami podkreślenia (
_
). Zachowaj ostrożność, jeśli plik o nowej nazwie już istnieje, nadpisze go. Skrypt można zmodyfikować w celu sprawdzenia takiego przypadku, ale nie wprowadziłem go w celu uproszczenia.źródło
Po odpowiedziach na https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters można użyć:
gdzie
*
pasuje do plików, których nazwę chcesz zmienić. Jeśli chcesz to zrobić w wielu katalogach, możesz zrobić coś takiego:Możesz użyć argumentu -n,
rename
aby wykonać próbę i zobaczyć, co by się zmieniło, bez zmiany.źródło
Miałem trochę japońskich plików ze zepsutymi nazwami plików odzyskanych z uszkodzonego pendrive'a i powyższe rozwiązania nie działały dla mnie.
Polecam pakiet detox:
Przykładowe użycie:
źródło
detox
zanim w zasadzie wymyślimy koło. Jeśli spojrzysz na stronę podręcznika, zobaczysz, że obejmuje ona wszystkie inne proponowane tutaj rozwiązania ze względu na swoją elastyczność.的节奏啊
Ale te znaki są poprawnymi nazwami plików.Ten skrypt powłoki dezynfekuje katalog rekurencyjnie, aby pliki były przenośne między Linux / Windows a FAT / NTFS / exFAT. Usuwa znaki kontrolne
/:*?"<>\|
i niektóre zastrzeżone nazwy systemu Windows, takie jakCOM0
.Linux jest mniej restrykcyjny w teorii (
/
i\0
jest surowo zabroniony w nazwach plików), ale w praktyce kilka znaków koliduje z poleceniami bash (jak*
...), więc należy ich unikać w nazwach plików.Świetne źródła ograniczeń nazewnictwa plików:
źródło
Jeśli chcesz obsługiwać osadzone znaki nowej linii, znaki wielobajtowe, spacje, wiodące myślniki, ukośniki odwrotne i spacje, potrzebujesz czegoś bardziej niezawodnego, zapoznaj się z tą odpowiedzią:
https://superuser.com/a/858671/365691
Jeśli ktoś jest zainteresowany, umieszczam skrypt na code.google.com: rnf-bash-rename-script
źródło
Używam tego jednowierszowego do usuwania nieprawidłowych znaków w plikach napisów:
Działa w celu normalizacji nazw katalogów filmów:
Te same kroki co powyżej, ale dodałem jeszcze jedną komendę sed, aby usunąć kropkę na końcu katalogu
X-Men Days of Future Past (2014) [1080p]
Zmodyfikowano do:
X-Men.Days.of.Future.Past.2014.1080p
źródło
dla pliku w *; do mv "$ file" $ (echo "$ file" | sed -e 's / [^ A-Za-z0-9. -] / / g'); gotowy &
źródło