Hoe om te gaan met spaties in bestandsnamen op Linux

Hoe om te gaan met spaties in bestandsnamen op Linux
fatmawati achmad zaenuri/Shutterstock.com
Als je een bestandsnaam met spaties op een Linux-systeem hebt, kan Bash deze correct behandelen door je bestandsnaam tussen aanhalingstekens te plaatsen. Tabaanvulling maakt het invoeren van bestandsnamen op de opdrachtregel eenvoudig, zelfs als deze spaties bevatten.

Zoals de meeste besturingssystemen ondersteunt Linux bestandsnamen met spaties erin. Maar het gebruik van deze bestandsnamen op de opdrachtregel is niet altijd eenvoudig. Hier zijn verschillende manieren waarop u kunt omgaan met bestandsnamen die spaties bevatten.

Inhoudsopgave

De bescheiden bestandsnaam
Waarom spaties in Linux-bestandsnamen lastig zijn
Hoe te citeren en te ontsnappen aan ruimtes
Hoe het ruimteprobleem bij de bron op te lossen
Tabbladuitbreiding maakt omgaan met spaties eenvoudig
Bestandsnamen met spaties gebruiken in bash-scripts
Uit elkaar geplaatst, maar niet schilferig

De bescheiden bestandsnaam

Alles wat op de harde schijf van uw computer is opgeslagen, moet een naam hebben. Zonder een naam zouden er geen bestanden bestaan. Alle toepassingen en daemons die worden gestart wanneer uw computer opstart, en alle software die u gebruikt, moeten worden geïdentificeerd en opgeslagen in een bestandssysteem. Die identificatie is de naam van het dossier.’

Wat betekent "Alles is een bestand" in Linux?

VERWANTWat betekent “Alles is een bestand” in Linux?

Hetzelfde geldt voor de bestanden die u maakt of installeert. Al uw documenten, afbeeldingen en muziek hebben bestandsnamen nodig. Zonder bestandsnamen zou geen van uw digitale middelen kunnen bestaan. Omdat bestandsnamen zo belangrijk zijn, doet Linux zijn uiterste best om zo min mogelijk regels op te leggen over hun samenstelling.

Onder Linux mag een bestandsnaam elk teken bevatten behalve de schuine streep naar voren “/” en het nulteken, 0x00. Het null-teken wordt gebruikt om het einde van een tekenreeks aan te geven, dus het kan niet aanwezig zijn in de tekenreeks zelf, anders zou Linux de bestandsnaam afkappen op de positie van het null-teken. De “/” forward slash wordt gebruikt als scheidingsteken in directorypaden.

Bestandsnamen zijn hoofdlettergevoelig en kunnen maximaal 255 bytes lang zijn, inclusief het null-teken. Directorypaden kunnen maximaal 4096 bytes lang zijn, inclusief het null-teken. Merk op dat dit hun lengte in is byteswat misschien niet direct gelijk staat aan karakters. 16-bits Unicode-tekens nemen bijvoorbeeld elk twee bytes in beslag.

Liefhebbers van retrocomputing en mensen met een lang geheugen zullen weten dat in de begintijd van personal computers, Microsoft’s Disk Operating System, DOS, niet hoofdlettergevoelig was en een maximale bestandsnaam had van acht tekens, plus een extensie van drie tekens.

Je moest heel attent en soms creatief zijn als je bestanden een naam gaf. Ter vergelijking: de vrijheid die we vandaag hebben, betekent dat we bestanden kunnen noemen wat we maar willen, zonder aan iets anders te denken dan aan de beschrijving die we voor dat bestand maken.

Maar met bestandsnamen, wat ons het vaakst doet struikelen, zijn niet de karakters die we typen, maar de spaties ertussen.

Waarom spaties in Linux-bestandsnamen lastig zijn

Shells zoals Bash interpreteren een door spaties gescheiden reeks woorden als individuele opdrachtargumenten, niet als een enkel argument. Hier is een voorbeeld, met behulp van touch om een ​​nieuw bestand met de naam “mijn nieuwe bestand.txt” te maken.

touch my new file.txt
ls

Proberen aanraking te gebruiken om een ​​bestand met spaties in de naam te maken

Zoals we kunnen zien, ls laat ons zien dat er drie bestanden zijn gemaakt, een met de naam “mijn”, een andere met de naam “nieuw” en nog een met de naam “file.txt”.

Let daar op touch klaagde niet of gooide een fout. Het voert uit wat het denkt dat we het vragen te doen. Dus het brengt ons stilletjes terug naar de opdrachtregel. Als we niet gemotiveerd zijn om te controleren, weten we niet dat de dingen niet volgens plan zijn verlopen.

Om het gewenste bestand te maken, moeten we citeren of ontsnappen.

Hoe te citeren en te ontsnappen aan ruimtes

Als we de volledige bestandsnaam citeren, touch weet dat het de geciteerde tekst als één enkel argument moet behandelen.

touch 'my new file.txt'
ls

Touch gebruiken om een ​​bestand te maken met spaties in de naam, waarbij de hele bestandsnaam tussen aanhalingstekens staat

Deze keer krijgen we het enkele bestand dat we verwachten.

We kunnen hetzelfde resultaat krijgen als we het backslash-teken “” om aan de ruimtes te ontsnappen. Door de spaties te “escapen” worden ze niet behandeld als speciale tekens, dat wil zeggen als scheidingstekens voor argumenten, ze worden beschouwd als gewone oude spaties.

touch my second new file.txt
ls

Gebruik aanraking om een ​​bestand te maken met spaties in de naam en backslashes

Dat werkt, maar het weglaten van spaties maakt het typen van bestandsnamen langzamer en foutgevoeliger. Dingen kunnen echt lelijk worden als je ook directorynamen hebt met spaties erin.

cp dir one/my text file.txt dir two/my text file.bak
ls

Escaped-spaties gebruiken in een opdracht om een ​​bestand van de ene map naar de andere te kopiëren

Die opdracht kopieert een enkel tekstbestand van een map met de naam “dir one” naar een map met de naam “dir two”, en slaat de kopie op als een BAK-bestand. En het is een vrij eenvoudig voorbeeld.

Hoe het ruimteprobleem bij de bron op te lossen

Als het uw eigen bestanden zijn, kunt u de beleidsbeslissing nemen om nooit spaties te gebruiken en bestandsnamen op deze manier maken (of massaal hernoemen).

mynewtextfile.txt

Toegegeven, dat is een robuuste oplossing, maar het is nog steeds lelijk. Er zijn betere opties, zoals het gebruik van streepjes “-” of onderstreept “_” om je woorden te scheiden.

my-new-text-file.txt
my_new_text_file.txt

Beide zullen het probleem omzeilen en ze zijn leesbaar. Als u geen extra tekens aan uw bestandsnamen wilt toevoegen, kunt u CamelCase gebruiken om uw bestandsnamen leesbaar te maken, zoals dit:

MyNewTextFile.txt

Tabbladuitbreiding maakt omgaan met spaties eenvoudig

Het aannemen van een naamgevingsconventie en je eraan houden helpt natuurlijk alleen als je met je eigen bestanden te maken hebt. Het is onwaarschijnlijk dat bestanden die ergens anders vandaan komen, uw aangenomen naamgevingsconventie zullen volgen.

U kunt tabuitbreiding gebruiken om u te helpen bij het nauwkeurig “invullen” van bestandsnamen voor ons. Laten we zeggen dat we het BAK-bestand dat we in “dir two” hebben gemaakt, willen verwijderen met behulp van rm.

We beginnen met het typen van “rm dir” omdat we de rm commando en we weten dat de mapnaam begint met “dir”.

rm dir

Het begin van een opdracht typen, voordat u op tab drukt om tabvoltooiing te gebruiken

Door op de “Tab” -toets te drukken, scant Bash naar overeenkomsten in de huidige map.

Door op tab te drukken is een backslash en een spatie toegevoegd aan het gedeeltelijke mappad

Er zijn twee mappen die beginnen met “dir”, en in beide gevallen is het volgende teken een spatie. Dus Bash voegt het backslash-teken toe “‘ en een spatie. Bash wacht dan op ons om het volgende personage te geven. Het heeft het volgende teken nodig om onderscheid te maken tussen de twee mogelijke overeenkomsten in deze map.

We typen een “t”, voor “twee”, en drukken dan nogmaals op “Tab”.

Het mappad na het typen van "t" en het indrukken van tab

Bash voltooit de mapnaam voor ons en wacht tot we het begin van de bestandsnaam typen.

We hebben maar één bestand in deze map, dus het typen van de eerste letter van de bestandsnaam, “m”, is voldoende om Bash te laten weten welk bestand we willen gebruiken. Door “m” te typen en op “Tab” te drukken, wordt de bestandsnaam voor ons voltooid en “Enter” voert de volledige opdracht uit.

De volledige bestandsnaam voltooid door op "m" te drukken en op Tab te drukken.

Tabbladuitbreiding maakt het gemakkelijk om ervoor te zorgen dat u de juiste bestandsnamen krijgt, en het versnelt ook het navigeren en typen op de opdrachtregel in het algemeen.

Bestandsnamen met spaties gebruiken in bash-scripts

Het is geen verrassing dat scripts precies dezelfde problemen hebben met spaties in bestandsnamen als de opdrachtregel. Als u een bestandsnaam als variabele doorgeeft, zorg er dan voor dat u de naam van de variabele citeert.

Dit kleine script controleert de huidige map op bestanden die overeenkomen met het bestandspatroon “*.txt”, en slaat ze op in een variabele genaamd file_list. EEN for lus wordt gebruikt om op elke lus een eenvoudige actie uit te voeren.

#!/bin/bash

file_list=*.txt

for file in $file_list
do
  ls -hl $file
done

Kopieer deze tekst naar een editor en sla deze op in een bestand met de naam “files.sh”. Gebruik dan de chmod commando om het uitvoerbaar te maken.

chmod +x files.sh

Chmod gebruiken om het script uitvoerbaar te maken

We hebben enkele bestanden in deze map. De ene heeft een eenvoudige bestandsnaam en de andere twee gebruiken onderstrepingstekens “_” of streepjes “-” in plaats van spaties. Dit is wat we zien als we het script uitvoeren.

./files.sh

Het script files.sh uitvoeren met bestandsnamen zonder spaties

Dat lijkt aardig te werken. Maar laten we de bestanden in de map wijzigen voor bestanden die spaties in hun naam bevatten.

./files.sh

Het script files.sh uitvoeren met bestandsnamen die spaties bevatten

Elk woord in elke bestandsnaam wordt behandeld alsof het een op zichzelf staande bestandsnaam is, en dus mislukt het script. Maar alles wat we moeten doen om het script spaties in bestandsnamen te laten verwerken, is het citeren van de $file variabele binnen de for lus.

#!/bin/bash

file_list=*.txt

for file in $file_list
do
ls -hl "$file"
done

Merk op dat het dollarteken “$‘ staat tussen de aanhalingstekens. We hebben die wijziging aangebracht en opgeslagen in het scriptbestand “files.sh”. Deze keer worden de bestandsnamen correct behandeld.

./files.sh

Het gewijzigde script files.sh verwerkt correct bestanden met spaties in hun bestandsnamen

Uit elkaar geplaatst, maar niet schilferig

Het vermijden van spaties in uw eigen bestandsnamen brengt u maar tot op zekere hoogte. Het is onvermijdelijk dat u bestanden van andere bronnen tegenkomt met namen die spaties bevatten. Gelukkig zijn er eenvoudige manieren om die bestanden op de opdrachtregel of in scripts te verwerken.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in