web analytics

Hoe werken met bestandsnamen met vreemde tekens in Linux

Print Friendly, PDF & Email

Bestandsnamen

We komen veel in contact met bestands- en foldernamen. In de meeste gevallen zijn bestands/foldernamen verwant met de inhoud van het bestand en starten ze met een letter of een cijfer.
Alfanumerieke bestandsnamen zijn ook populair, worden veel gebruikt en daar zijn we mee vertrouwd. Dat dat kan echter niet gezegd worden van bestands/foldernamen die vreemde tekens bevatten,

Met vreemde tekens worden niet de tekens met accenten bedoeld zoals élève.txt of garçon.txt, maar wel de tekens zoals !@#$%^ enz…

Beperkingen

De vreemde tekens die we hier gaan gebruiken gelden enkel voor Linux bestandssystemen zoals EXT4. Wanneer je bestanden uitwisselt met Windows via FAT of NTFS kunnen de resultaten soms leiden tot onleesbaarheid van de bestandsnaam, of het niet correct overnemen van de bestandsnamen. Kijk achteraan dit artikel vooreen lijst van gekende problemen met bestandsnamen in Windows bestandsystemen.

Daar puur technisch gesproken alles in Linux een bestand is, weze het een driver, apparaat, een map, … dan zijn de regels hieronder op meer dan gewoon bestanden van toepassing.

Voorbeelden van veel voorkomende bestandsnamen:

  • abc.txt
  • avi.txt
  • debian.txt

Voorbeelden van numerieke bestandsnamen:

  • 121.txt
  • 3221.txt
  • 674659.txt

Voorbeelden van alfanumerieke bestandsnamen:

  • eg84235.txt
  • 3kf43nl2.txt
  • 2323ddw.txt

Voorbeelden van minder frequent voorkomende bestandsnamen met speciale tekens:

  • -abc.txt
  • #fbjdew.txt
  • ;321.txt

Bij het bekijken van de bestandsnamen hier net boven kan je je afvragen hoe je bestanden/folders kan aanmaken/bewerken met namen die een Hash (#), puntcomma (;), dash (-) of eender welk ander vreemd teken bevatten.

Bestanden met een dash (-) in de naam

BASH herkent alles na een dash (het min tekentje) als een optie.
Vandaar dat bestanden die beginnen met een dash zoals -abc.txt fouten geven wanneer je die gebruikt in je commandolijn.

$ touch -abc.txt
touch: ongeldige optie -- 'b'
Typ 'touch --help' voor meer informatie.

Bovenstaande fout wordt gegenereerd omdat de shell alles na een dash (-) herkent als een optie. Daar er voor het touch commando geen optie -abc.txt bestaat wordt de fout getoond.

Om zo’n fout op te lossen, moet je de Bash shell vertellen dat alles na de dash (-) niet als een optie dient ingelezen te worden.

Je kan dat doen door op twee manieren:

  • $ touch ./-abc.txt [Optie #1 - Voorkeur]
  • $ touch -- -abc.txt [Optie #2]

Controleren met het ls of ls-l commando.
$ ls -l
totaal 0
-rw-r--r-- 1 alain alain 0 jul 14 20:05 -abc.txt

Om zo’n bestand te verwijderen tik je:

$ rm ./-abc.txt

Als je meerdere bestanden hebt in een folder die met een een dash beginnen en je wenst ze allemaal te verwijderen, doe je het volgende:
$ rm ./-*

Bestanden met een HASH (#) in de naam

BASH herkent alles na een hash (#) als commentaar.

Maak een bestand #abc.txt aan

$ touch #abc.txt
touch: geen bestand opgegeven
Typ 'touch --help' voor meer informatie.
$

De reden voor de foutmelding is dat Bash #abc.txt als commentaar aanziet en als het  ware het touch commando uitvoert zonder een bestandsnaam. Vandaar de fout.

Om dat probleem op te lossen vragen we BASH om het # teken niet als commentaar te herkennen als volgt.

$ touch ./#abc.txt
of
$ touch '#abc.txt'

Kijk of het bestand aangemaakt werd via:

$ ls -l
totaal 0
-rw-r--r-- 1 alain alain 0 jul 15 18:53 #abc.txt

Wat gebeurt er als je nu twee bestanden simultaan aanmaakt (bv a.txt en #bc.txt) :

$ touch a.txt #bc.txt

Bij controle blijkt dat enkel het eerste bestand werd aangemaakt.

$ ls -l
total 0
-rw-r--r-- 1 avi avi 0 Jun 8 12:18 a.txt

Pas je commando als volgt aan om het # probleem te omzeilen.

$ touch a.txt ./#bc.txt
of
$ touch a.txt '#bc.txt'

en controleer

$ ls -l
total 0
-rw-r--r-- 1 avi avi 0 Jun 8 12:20 a.txt
-rw-r--r-- 1 avi avi 0 Jun 8 12:20 #bc.txt

Om alle bestanden te verwijderen die een #-teken in de naam hebben gebruik je:

$ rm ./#*

Bestanden met een puntkomma (;) in de naam.

Binnen BASH gedraagt een puntkomma zich als opdrachtscheidingsteken. Een puntkomma laat je toe meerdere opdrachten ineens uit te voeren.

Maak een bestand aan met een puntkomma in de naam en zie wat er gebeurt:

$ touch ;abc.txt
touch: geen bestand opgegeven
Typ 'touch --help' voor meer informatie.
abc.txt: opdracht niet gevonden

Hier ligt de reden in het feit dat BASH touch ;abc.txt als twee opdrachten herkent, namelijk

  • touch
  • abc.txt

Nu hebben we al gezien dat touch altijd een bestandsnaam moet hebben als parameter. Daarnaast is abc.txt geen geldig BASH commando.

Ook hier kun je het probleem omzeilen door je opdracht als volgt aan te passen. Sluit je bestandsnaam in tussen twee enkele quotes:

$ touch ./';abc.txt'
of
$ touch ';abc.txt'

De enkele quotes laten BASH weten dat het ; tekentje deel uitmaakt van de bestandsnaam en geen opdrachtscheidingsteken is.

Andere speciale tekens in bestands/foldernamen

Speciale tekens die geen speciale behandeling vragen

  • + plus ⇒ $ touch maart+april.odt
  • % percent ⇒ $ touch %13.txt
  • @ at ⇒ $ touch @hilde.txt
  • ^ caret ⇒ $ touch ^23.txt
  • _ underscore ⇒ $ touch maand_april.txt
  • = gelijkaan ⇒ $ touch a=b.txt
  • ? vraagteken ⇒ $ touch inorde?.txt
  • , comma ⇒ $ touch a,b,c,.txt
  • : dubbelpunt ⇒ $ touch mijn:huis.txt
  • ~ tilde (bv: $ touch ~ongeveer_juist.txt
  • {} accolades ⇒ $ touch {demo.txt}
  • [] vierkante haakjes $ touch [tijdelijkbestand.txt]
  • Euro teken ⇒ $ touch 20@.txt
  • * asterix ⇒ $ touch 2*6.txt
    Pas wel op met het verwijderen van zulke bestandsnamen.
    Gebruik nooit $ rm * of $ rm -rf * maar gebruikt $ rm ./*.txt

Bij volgende tekens dien je de bestandnaam tussen enkele quotes ‘ ‘ te plaatsen

  • $ Dollar teken ⇒ $ touch '$23.txt'
  • ! Uitroepteken ⇒ $ touch ‘!a.txt’
  • & Ampersand ⇒ $ touch ‘&12.txt’
  • () Ronde haakjes ⇒ $ touch ‘(bedrag.txt)’
  • <> Chevrons ⇒ $ touch ‘<abc.txt>’
  • | pipe ⇒ $ touch ‘a|b.txt’
  • \ Backslash ⇒ $ touch ‘\test.txt’
    Een backslash in BASH geeft normaal aan dat het volgend teken genegeerd moet worden. Door het tussen quotes te zetten omzeil je die beperking

Nog enkele speciale gevallen

Het geval van de / (forward slash)

Je kan onmogelijk een bestandsnaam gebruiken die een forward flash / bevat. Indien je dat wel kan doen heeft je systeem een bug of je hebt Unicode ondersteuning. In dat laatste geval is de forward slash geen echte / maar een Unicode karakter dat lijkt op een /

Punt of dot (.) in een bestandsnaam

Bestanden die beginnen met een . zijn speciale bestanden die ook dot-files genoemd worden. Het zijn verborgen bestanden die meestal configuratie of systeembestanden zijn. Om ze te zien moet je in BASH het ls commando gebruiken met de -a of -A parameter.
Voor de rest is het aanmaken, hernoemen of verwijderen identiek aan andere, gewone bestandsnamen.
Daarnaast mag je in Linux zoveel dots (.) zetten als je maar wil:
$ touch 1.2.3.4.5.6.7.8.9.10.txt
en controlleer via
$ ls -l
total 0
-rw-r--r-- 1 avi avi 0 Jun 8 14:32 1.2.3.4.5.6.7.8.9.10.txt

Enkele of dubbele quotes

Hier geldt de omwisselingsregel. Als je een bestandsnaam met een enkele quote hebt, plaats je die tussen dubbele quotes en dubbele quotes in een bestandsnaam worden omsloten door enkele quotes.
$ touch "15'.txt"
and
$ touch '15”.txt'

Spaties in bestandnamen

Je komt ze veel tegen, bestandsnamen met spaties zoals rapport mei 2015.odt
Het is geen goed idee om spaties in bestandsnamen te zetten en als je een duidelijk verstaanbare bestandsnaam hebt, die je beter om de spaties te vervangen door underscores (_) of een dash (-). Spaties aan het eind van de naam worden genegeerd.

Als je echter in BASH een bestand moet aanmaken met spaties, dan moet je via de backslash (\) aangeven dat de betekenis van het volgende karakter genegeerd moet worden. Om bovenstaand bestand aan te maken gebruik je dus:
$ touch rapport\ mei\ 2105.txt

Interactie met Windows

Volgende tekens zijn niet toegestaan in NTFS en FAT (zie Windows File Name Convention):

  • < (kleiner dan)
  • > (groter dan)
  • : (dubbel punt)
  • ” (dubbele quote)
  • / (forward slash)
  • \ (backslash)
  • | (pipe)
  • ? (vraagteken)
  • * (asterisk)
  • . (dot) enkel aan het einde van de naam

Gevolg

Kijk bij de aankoop van een NAS altijd naar het bestandssysteem dat gebruikt wordt door je NAS want je kan geen enkele harde schijf of SSD of USB-stick die geformatteerd is met FAT of NTFS gebruiken als backup medium voor bestanden die van een Linux FS komen (zoals EXT4) als je 100% garantie wiil dat je bestandsnamen herkend zullen worden.

Beoordeling

Geef een reactie

%d bloggers liken dit: