Sådan manipuleres filnavne med mellemrum og specialtegn i Linux


Vi støder på filer og mappenavn meget regelmæssigt. I de fleste tilfælde er fil-/mappenavn relateret til indholdet af filen/mappen og starter med antal og tegn. Alfanumeriske filnavne er ret almindelige og meget udbredt, men det er ikke tilfældet, når vi skal beskæftige os med fil-/mappenavn, der indeholder specialtegn.

Bemærk: Vi kan have filer af enhver art, men for enkelhed og nem implementering vil vi beskæftige os med tekstfil (.txt) i hele artiklen.

Eksempel på mest almindelige filnavne er:

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

Eksempel på numeriske filnavne er:

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

Eksempel på alfanumeriske filnavne er:

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

Eksempler på filnavne, der har speciel karakter og ikke er meget almindelige:

#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt
...

Et af de mest åbenlyse spørgsmål her er - hvem der i alverden opretter/behandler filer/mapper, der har en Hash (#) , en semikolon (;) , en bindestreg (-) eller ethvert andet specialtegn.

Jeg er enig med dig i, at sådanne filnavne ikke er almindelige, men din shell skal ikke gå i stykker/give op, når du skal håndtere sådanne filnavne. Også teknisk set bliver alle ting det være sig mappe, driver eller noget andet behandlet som en fil i Linux.

Håndtering af fil, der har bindestreg (-) i navnet

Opret en fil, der starter med en bindestreg (-) , siger -abx.txt.

$ touch -abc.txt
touch: invalid option -- 'b'
Try 'touch --help' for more information.

Årsagen til ovenstående fejl, at shell fortolker noget efter en bindestreg (-) , som mulighed, og selvfølgelig er der ingen sådan mulighed, derfor er fejlen.

For at løse en sådan fejl er vi nødt til at fortælle Bash-skallen (ja dette og de fleste andre eksempler i artiklen er for BASH) om ikke at fortolke noget efter specialtegn (her bindestreg), som mulighed.

Der er to måder at løse denne fejl på som:

$ touch -- -abc.txt		[Option #1]
$ touch ./-abc.txt		[Option #2]

Du kan kontrollere den således oprettede fil på begge ovenstående måder ved at køre kommandoer ls eller ls -l for lang liste.

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 11:05 -abc.txt

For at redigere ovenstående fil kan du gøre:

$ nano -- -abc.txt 
or 
$ nano ./-abc.txt 

Bemærk: Du kan erstatte nano med en hvilken som helst anden editor efter eget valg, siger vim som:

$ vim -- -abc.txt 
or 
$ vim ./-abc.txt 

Tilsvarende for at flytte en sådan fil skal du gøre:

$ mv -- -abc.txt -a.txt
or
$ mv -- -a.txt -abc.txt

og for at slette denne fil skal du gøre:

$ rm -- -abc.txt
or
$ rm ./-abc.txt 

Hvis du har mange filer i en mappe, hvis navn indeholder bindestreg, og du vil slette dem alle på én gang, skal du gøre som:

$ rm ./-*

1. Den samme regel som beskrevet ovenfor følger for ethvert antal hypen i filens navn og deres forekomst. Viz., -A-b-c.txt, ab-c.txt, abc-.txt osv.

2. Den samme regel som diskuteret ovenfor følger for navnet på mappen, der har et hvilket som helst antal hypen og deres forekomst, bortset fra det faktum, at for at slette mappen skal du bruge 'rm -rf' som:

$ rm -rf -- -abc
or
$ rm -rf ./-abc

Håndtering af filer med HASH (#) i navnet

Symbolet # har en meget anden betydning i BASH. Alt efter en # fortolkes som kommentar og følgelig forsømmes af BASH.

Opret en fil # abc.txt.

$ touch #abc.txt
touch: missing file operand
Try 'touch --help' for more information.

Årsagen til ovenstående fejl, at Bash fortolker # abc.txt en kommentar og dermed ignorerer. Så kommandotouch er sendt uden nogen fil Operand, og dermed er fejlen.

For at løse en sådan fejl kan du bede BASH om ikke at fortolke # som kommentar.

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

og bekræft den lige oprettede fil som:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:14 #abc.txt

Opret nu en fil, hvis navn indeholder # hvor som helst undtagen ved tiggeriet.

$ touch ./a#bc.txt
$ touch ./abc#.txt

or
$ touch 'a#bc.txt'
$ touch 'abc#.txt'

Kør 'ls -l' for at bekræfte det:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 a#bc.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 abc#.txt

Hvad sker der, når du opretter to filer (siger a og #bc) på én gang:

$ touch a.txt #bc.txt

Bekræft den lige oprettede fil:

$ ls -l

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

Det fremgår klart af ovenstående eksempel, at den kun oprettede fil 'a' og fil '#bc' er blevet ignoreret. For at udføre ovennævnte situation med succes kan vi gøre,

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

og bekræft det som:

$ 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

Du kan flytte filen som:

$ mv ./#bc.txt ./#cd.txt
or
$ mv '#bc.txt' '#cd.txt'

Kopier det som:

$ cp ./#cd.txt ./#de.txt
or
$ cp '#cd.txt' '#de.txt'

Du kan redigere det som ved hjælp af dit valg af editor som:

$ vi ./#cd.txt
or
$ vi '#cd.txt'
$ nano ./#cd.txt
or
$ nano '#cd.txt'

Og slet det som:

$ rm ./#bc.txt 
or
$ rm '#bc.txt'

For at slette alle de filer, der har hash (#) i filnavnet, kan du bruge:

 # rm ./#*

Håndtering af filer med semikolon (;) i navnet

Hvis du ikke er opmærksom, fungerer semikolon som en kommandoseparator i BASH og måske også en anden shell. Semikolon giver dig mulighed for at udføre flere kommandoer på én gang og fungerer som separator. Har du nogensinde beskæftiget dig med et filnavn med semikolon? Hvis ikke her, vil du.

Opret en fil med semikolon i.

$ touch ;abc.txt
touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

Årsagen til ovenstående fejl, at når du kører ovenstående kommando, fortolker BASH touch som en kommando, men kunne ikke finde nogen filoperand før semikolon og rapporterer derfor om fejl. Det rapporterer også en anden fejl, som 'abc.txt' kommando ikke blev fundet, kun fordi BASH efter semikolon forventede en anden kommando og 'abc.txt' ikke er en kommando.

For at løse en sådan fejl skal du fortælle BASH ikke at fortolke semikolon som kommandoseparator som:

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

Bemærk: Vi har vedlagt filnavnet med et enkelt tilbud . Det fortæller BASH, at ; er en del af filnavnet og ikke kommandoseparator.

Resten af handlingen (nemlig, kopier, flyt, slet) på filen og mappen med semikolon i navnet kan udføres lige frem ved at omslutte navnet i et enkelt tilbud.

Håndtering af andre specialtegn i fil-/mappenavn

Kræver ikke noget ekstra, gør det bare normalt, så simpelt filnavn som vist nedenfor.

$ touch +12.txt 

Du skal vedlægge filnavnet i et enkelt tilbud, som vi gjorde i tilfælde af semikolon. Resten af tingene er lige frem ..

$ touch '$12.txt'

Du behøver ikke gøre noget anderledes, behandle det som en normal fil.

$ touch %12.txt

At have stjerne i filnavn ændrer ikke noget, og du kan fortsætte med at bruge det som en normal fil.

$ touch *12.txt

Bemærk: Når du skal slette en fil, der starter med * , skal du aldrig bruge følgende kommandoer til at slette sådanne filer.

$ rm *
or
$ rm -rf *

Brug i stedet

$ rm ./*.txt

Indsæt bare filnavnet i et enkelt tilbud, og resten af tingene er de samme.

$ touch '!12.txt'

Intet ekstra, behandl et filnavn, der har At Sign som en ikke-mal fil.

$ touch '@12.txt'

Ingen ekstra opmærksomhed krævet. Brug en fil med ^ i filnavnet som normal fil.

$ touch ^12.txt

Filnavn skal være indeholdt i enkelte tilbud, og du er klar til at gå.

$ touch '&12.txt'

Hvis filnavnet har parentes, skal du vedlægge filnavnet med enkelt anførselstegn.

$ touch '(12.txt)'

Ingen ekstra pleje nødvendig. Bare behandl det som bare en anden fil.

$ touch {12.txt}

Et filnavn med Chevrons skal vedlægges i enkelte citater.

$ touch '<12.txt>'

Behandl filnavnet med firkantede parenteser som normale filer, og du behøver ikke tage ekstra pleje af det.

$ touch [12.txt]

De er meget almindelige og kræver ikke noget ekstra. Bare gør hvad du ville have gjort med en normal fil.

$ touch _12.txt

At have et ligestillet tegn ændrer ikke noget, du kan bruge det som en normal fil.

$ touch =12.txt

Backslash fortæller shell at ignorere det næste tegn. Du skal vedlægge filnavnet i et enkelt tilbud, som vi gjorde i tilfælde af semikolon. Resten af tingene er lige frem.

$ touch '.txt'

Du kan ikke oprette en fil, hvis navn inkluderer en skråstreg (/) , før dit filsystem har en fejl. Der er ingen måde at undslippe en skråstreg fremad.

Så hvis du kan oprette en fil som '/12.txt' eller 'b/c.txt', har enten dit filsystem fejl eller har du Unicode-understøttelse, som giver dig mulighed for at oprette en fil med skråstreg. I dette tilfælde er skråstreg fremad ikke et rigtigt skråstreg, men et Unicode-tegn, der ligner et skråstreg fremad.

Igen, et eksempel, hvor du ikke behøver at gøre noget særligt forsøg. Et filnavn med spørgsmålstegn kan behandles på den mest generelle måde.

$ touch ?12.txt

Filerne, der starter med punkt (.) , er meget specielle i Linux og kaldes dot-filer. De er skjulte filer generelt en konfiguration eller systemfiler. Du skal bruge switch '-a' eller '-A' med ls-kommandoen for at se sådanne filer.

Oprettelse, redigering, omdøbning og sletning af sådanne filer er ligetil.

$ touch .12.txt

Bemærk: I Linux har du muligvis så mange prikker (.) som du har brug for i et filnavn. I modsætning til andre systemprikker i filnavn betyder det ikke at adskille navn og udvidelse. Du kan oprette en fil med flere prikker som:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

og tjek det som:

$ 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

Du kan have komma i et filnavn, så mange du vil, og du behøver ikke noget ekstra. Bare gør det på normal måde, som et enkelt filnavn.

$ touch ,12.txt
or
$ touch ,12,.txt

Du kan have kolon i et filnavn, så mange du vil, og du behøver ikke noget ekstra. Bare gør det på normal måde, som et enkelt filnavn.

$ touch :12.txt
or
$ touch :12:.txt

For at have tilbud i filnavnet skal vi bruge udvekslingsreglen. Det vil sige, at hvis du har brug for et enkelt tilbud i filnavnet, skal du vedlægge filnavnet med dobbelt anførselstegn, og hvis du har brug for et dobbelt tilbud i filnavnet, skal du vedlægge det med et enkelt tilbud.

$ touch "15'.txt"

and

$ touch '15”.txt'

Nogle redaktører i Linux som emacs opretter en sikkerhedskopifil af den fil, der redigeres. Sikkerhedskopifilen har navnet på den originale fil plus en tilde i slutningen af filnavnet. Du kan have en fil, hvis navn inkluderer tilde, hvor som helst, blot som:

$ touch ~1a.txt
or
$touch 2b~.txt

Opret en fil, hvis navn har mellemrum mellem tegn/ord, sig "hej mit navn er avishek.txt".

Det er ikke en god ide at have filnavne med mellemrum, og hvis du skal have et særskilt læsbart navn, skal du bruge, understreg eller strejke. Men hvis du skal oprette en sådan fil, skal du bruge bagudvendt skråstreg, som ignorerer det næste tegn til den. For at oprette ovenstående fil skal vi gøre det på denne måde ..

$ touch hi\ my\ name\ is\ avishek.txt

hi my name is avishek.txt

Jeg har prøvet at dække alt det scenarie, du måtte komme på tværs af. De fleste af ovenstående implementeringer er eksplicit for BASH Shell og fungerer muligvis ikke i andre shell.

Hvis du føler, at jeg savnede noget (der er meget almindelig og menneskelig natur), kan du medtage dit forslag i kommentarerne nedenfor. Hold forbindelsen, fortsæt med at kommentere. Bliv hængende og forbundet! Synes godt om og del os og hjælp os med at blive spredt!