Vraag Hoe ongeldige tekens uit bestandsnamen te verwijderen?


Ik heb bestanden met ongeldige tekens zoals deze

009_-_�%86ndringshåndtering.html

Het is een Æ waar iets fout is gegaan in de bestandsnaam.

Is er een manier om alleen alle ongeldige tekens te verwijderen?

of kon tr op de een of andere manier worden gebruikt?

echo "009_-_�%86ndringshåndtering.html" | tr ???

40
2018-01-10 14:07


oorsprong


De karakters zijn waarschijnlijk niet "ongeldig", anders slaat het bestandssysteem ze niet op (tenzij je iets hebt gedaan werkelijk smerig voor de FS). Heb je geprobeerd je locale te wijzigen (bijvoorbeeld naar UTF8) om de namen correct weer te geven? - James O'Gorman


antwoorden:


Een manier zou zijn met sed:

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

Vervangen file met je bestandsnaam, natuurlijk. Hiermee wordt alles vervangen dat geen letter, getal, punt, onderstrepingsteken of streepje is met een onderstrepingsteken. Je kunt tekens toevoegen of verwijderen om ze te behouden zoals je wilt, en / of het vervangende personage veranderen in iets anders of helemaal niets.


37
2018-01-10 14:22



Ik gebruikte: f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_} - Louis


Ik neem aan dat je op Linux Box zit en dat de bestanden in een Windows-box zijn gemaakt. Linux gebruikt UTF-8 als de karaktercodering voor bestandsnamen, terwijl Windows iets anders gebruikt. Ik denk dat dit de oorzaak van het probleem is.

Ik zou "convmv" gebruiken. Dit is een tool die bestandsnamen van de ene tekencodering naar de andere kan converteren. Voor West-Europa werkt een van deze normaal gesproken:

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 .

Als u het op een op Debian gebaseerde Linux moet installeren, kunt u dit doen door het volgende uit te voeren:

sudo apt-get install convmv

Het werkt elke keer voor mij en het herstelt de oorspronkelijke bestandsnaam.

Bron: LeaseWebLabs


28
2017-12-25 00:23



dit ziet er veelbelovend uit, maar elk idee hoe te vertellen wat de codering is? Ik heb een map genaamd Save the current file in Word 97-2004 format\sco.workflow die is gemaakt op mijn Mac (via Microsoft Office) en de bovenstaande coderingen hebben geen enkel effect. - Sridhar-Sarnobat


Ik neem aan dat je bedoelt dat je het bestandssysteem wilt doorlopen en al zulke bestanden wilt repareren?

Dit is de manier waarop ik het zou doen

find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
  print("Renaming $_ to $new\n"); rename($_, $new);
}'

Dat zou alle bestanden met niet-ascii karakters vinden en die karakters vervangen door underscores (_). Wees echter voorzichtig, als een bestand met de nieuwe naam al bestaat, zal het het overschrijven. Het script kan worden aangepast om te controleren op een dergelijk geval, maar ik heb dit niet toegevoegd om het eenvoudig te houden.


15
2018-01-10 14:41





Volgende antwoorden op https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, Je kunt gebruiken:

rename 's/[^\x00-\x7F]//g' *

waar * komt overeen met de bestanden die u wilt hernoemen. Als u het wilt doen via meerdere mappen, kunt u iets doen als:

find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;

U kunt het -n-argument gebruiken voor rename om een ​​run uit te voeren en te zien wat er veranderd zou worden, zonder het te veranderen.


11
2018-05-25 10:52



Is er een manier om dit aan te passen om buitenlandse karakters zoals ü en ä bijvoorbeeld te behouden? - Elder Geek
Alleen de tweede werkte voor mij. Alles stond in dezelfde directory, dus ik weet niet zeker wat het verschil is ..? - Shautieh
@Shautieh: de -n stopt het om daadwerkelijk te draaien. Ik zal het antwoord verduidelijken. - naught101


Dit shell-script zuivert een map recursief, om bestanden draagbaar te maken tussen Linux / Windows en FAT / NTFS / exFAT. Het verwijdert controle karakters, /:*?"<>\| en een aantal gereserveerde Windows-namen zoals COM0.

sanitize() {
  shopt -s extglob;

  filename=$(basename "$1")
  directory=$(dirname "$1")

  filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')

  if (test "$filename" != "$filename_clean")
  then
    mv -v "$1" "$directory/$filename_clean"
  fi
}

export -f sanitize

sanitize_dir() {
  find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}

sanitize_dir '/path/to/somewhere'

Linux is minder beperkend in theorie (/ en \0 zijn ten strengste verboden in bestandsnamen) maar in de praktijk interfereren verschillende karakters met bashcommando's (zoals *...) dus ze moeten ook worden vermeden in bestandsnamen.

Geweldige bronnen voor bestandsnaambeperkingen:


5
2018-05-11 20:50



Het wat ik zoek! maar voeg quotes toe om dirs met spaties te ondersteunen zoek "$ 1" -depth -exec bash -c 'sanitize "$ 0"' {} \; - mmv-ru


Ik had een aantal Japanse bestanden met gebroken bestandsnamen hersteld van een kapotte USB-stick en de bovenstaande oplossingen werkten niet voor mij.

Ik raad het detox-pakket aan:

Het detox-hulpprogramma hernoemt bestanden zodat ze gemakkelijker te gebruiken zijn. Het verwijdert spaties en andere dergelijke ergernissen. Het vertaalt of opschoont ook Latin-1-tekens (ISO 8859-1) die zijn gecodeerd in 8-bits ASCII, Unicode-tekens die zijn gecodeerd in UTF-8 en CGI-escapetekens.

Voorbeeld gebruik:

detox -r -v /path/to/your/files
-r Recurse in subdirectories
-v Wees uitgebreid over welke bestanden worden hernoemd
-n Kan worden gebruikt voor een droge run (laat alleen zien wat er zou veranderen)

5
2017-08-30 06:57



Dit zou veel hoger moeten zijn, ik dring er bij iedereen op aan om naar te kijken detox voordat het wiel in wezen opnieuw wordt uitgevonden. Als u naar de manpagina kijkt, ziet u dat hier alle andere voorgestelde oplossingen worden behandeld vanwege de flexibiliteit. - emk2203


Als je ingesloten nieuwe regels, multibyte-tekens, spaties, leading dashes, backslashes en spaties wilt gebruiken, heb je iets robuuster nodig, zie dit antwoord:
https://superuser.com/a/858671/365691

Ik zet het script op code.google.com als iemand geïnteresseerd is: r-n-f-dreun-rename-script


0
2017-12-31 00:09