Řešení 1:
Jedním ze způsobů by bylo sed:
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
Nahraďte file
s vaším názvem souboru, samozřejmě. Tím se vše, co není písmeno, číslo, tečka, podtržítko nebo pomlčka, nahradí podtržítkem. Můžete přidat nebo odebrat znaky, které chcete zachovat, a/nebo změnit náhradní znak na cokoli jiného nebo vůbec nic.
Řešení 2:
Předpokládám, že používáte Linux a soubory byly vytvořeny na Windows. Linux používá UTF-8 jako kódování znaků pro názvy souborů, zatímco Windows používá něco jiného. Myslím, že toto je příčina problému.
Použil bych "convmv". Jedná se o nástroj, který dokáže převádět názvy souborů z jednoho kódování znaků do jiného. Pro západní Evropu obvykle funguje jedna z těchto možností:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
Pokud jej potřebujete nainstalovat na Linux založený na Debianu, můžete tak učinit spuštěním:
sudo apt-get install convmv
Funguje mi to pokaždé a obnoví původní název souboru.
Zdroj:LeaseWebLabs
Řešení 3:
Z poškozeného USB klíče jsem obnovil některé japonské soubory s poškozenými názvy souborů a výše uvedená řešení mi nefungovala.
Doporučuji detoxikační balíček:
Nástroj detox přejmenovává soubory, aby se s nimi lépe pracovalo. Odstraňuje mezery a další podobné nepříjemnosti. Přeloží nebo vyčistí také znaky Latin-1 (ISO 8859-1) zakódované v 8bitovém ASCII, znaky Unicode zakódované v UTF-8 a CGI uniklé znaky.
Příklad použití:
detox -r -v /path/to/your/files
-r Recurse into subdirectories -v Be verbose about which files are being renamed -n Can be used for a dry run (only show what would be changed)
Řešení 4:
Předpokládám, že chcete procházet souborovým systémem a opravit všechny takové soubory?
Zde je způsob, jak bych to udělal
find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
print("Renaming $_ to $new\n"); rename($_, $new);
}'
Tím by se našly všechny soubory se znaky mimo ASCII a tyto znaky byly nahrazeny podtržítky (_
). Buďte však opatrní, pokud soubor s novým názvem již existuje, přepíše jej. Skript lze upravit pro kontrolu takového případu, ale nevložil jsem to, aby to bylo jednoduché.
Řešení 5:
Následující odpovědi na https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, Můžete použít:
rename 's/[^\x00-\x7F]//g' *
kde *
odpovídá souborům, které chcete přejmenovat. Pokud to chcete udělat přes více adresářů, můžete udělat něco jako:
find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;
Argument -n můžete použít pro rename
provést zkoušku nasucho a zjistit, co by se změnilo, aniž byste to změnili.