GNU/Linux >> Znalost Linux >  >> Linux

Jak odstranit neplatné znaky z názvů souborů?

Ř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.


Linux
  1. Jak odinstalovat aria2 z Ubuntu

  2. Jak odstraním soubory z koše na Ubuntu?

  3. Jak odstranit iso 9660 z USB?

  1. Přejmenujte více souborů, abyste odstranili společnou příponu z názvů souborů

  2. Jak zabránit procesu v zápisu souborů

  3. Jak odstranit soubory ._ v adresáři? Ubuntu

  1. Jak odstranit řádky, které se objevují v souboru B, z jiného souboru A?

  2. Odstraňte mezery z názvů souborů v Linuxu

  3. Jak hromadně přejmenovat soubory s neplatným kódováním nebo hromadně nahradit neplatné kódované znaky?