Kuidas manipuleerida failinimedega, millel on Linuxis tühikud ja erimärgid


Failide ja kaustade nimedega puutume kokku väga regulaarselt. Enamasti on faili/kausta nimi seotud faili/kausta sisuga ning algab numbri ja märkidega. Tähtnumbriline failinimi on üsna levinud ja väga laialt kasutatav, kuid see pole nii, kui peame tegelema faili/kausta nimega, milles on erimärgid.

Märkus. Meil võib olla mis tahes tüüpi faile, kuid lihtsuse ja lihtsa rakendamise huvides käsitleme kogu artiklis tekstifaili (.txt).

Kõige tavalisemate failinimede näited on järgmised:

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

Numbriliste failinimede näited on järgmised:

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

Tähtnumbriliste failinimede näited on järgmised:

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

Näited failinimedest, millel on erimärk ja mis pole eriti levinud:

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

Üks kõige ilmsem küsimus on siin - kes maa peal loob/tegeleb failide/kaustade nimega, millel on räsi (#) , semikoolon (;) , kriips (-) või mõni muu erimärk.

Nõustun teiega, et sellised failinimed pole levinud, kuid teie shell ei tohiks katki minna/loobuda, kui peate selliste failinimedega tegelema. Ka tehniliselt rääkides käsitletakse Linuxis failidena faile, olgu see siis kaust, draiver või muu.

Failiga tegelemine, mille nimes on kriips (-)

Looge fail, mis algab kriipsuga (-) , öelge -abx.txt.

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

Eespool toodud vea põhjuseks on see, et shell tõlgendab pärast kriipsu (-) kõike valikuna ja ilmselgelt sellist võimalust pole, seega on see viga.

Sellise vea lahendamiseks peame ütlema Bashi kestale (see ja enamik teisi näiteid artiklis on mõeldud BASH-ile), et mitte tõlgendada midagi erimärgi (siin kriips) järel.

Selle tõrke lahendamiseks on kaks võimalust:

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

Nii loodud faili saate kontrollida mõlemal ülaltoodud viisil, käivitades pika loendi jaoks käsud ls või ls -l.

$ ls -l

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

Ülaltoodud faili muutmiseks võite teha järgmist.

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

Märkus. Võite nano asendada mis tahes muu valitud redaktoriga, öelge vim järgmiselt:

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

Samamoodi peate sellise faili teisaldamiseks tegema järgmist.

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

ja selle faili kustutamiseks peate tegema järgmist.

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

Kui teil on kaustas, mille nimi sisaldab kriipsu, palju faile ja soovite need kõik korraga kustutada, tehke järgmist.

$ rm ./-*

1. Faili nimel olevate suvaliste arvude ja nende esinemise kohta järgitakse sama reeglit, mida eespool arutati. Viz., -A-b-c.txt, ab-c.txt, abc-.txt jne.

2. Eespool käsitletud reegel kehtib suvalise arvu sidekohtadega kausta nime ja esinemise kohta, välja arvatud asjaolu, et kausta kustutamiseks peate kasutama rm -rf:

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

Failidega tegelemine, mille nimes on HASH (#)

Sümbolil # on BASH-is väga erinev tähendus. Kõiki # taga olevaid asju tõlgendatakse kommentaaridena ja seetõttu jätab BASH selle tähelepanuta.

looge fail # abc.txt.

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

Eespool toodud vea põhjus on see, et Bash tõlgendab # abc.txt kommentaari ja ignoreerib seda. Nii et käsk touch on edastatud ilma faili Operandita ja seega on see viga.

Sellise vea lahendamiseks võite paluda BASHil mitte tõlgendada # kommentaarina.

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

ja kontrollige äsja loodud faili järgmiselt:

$ ls -l

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

Nüüd looge fail, mille nimi sisaldab # kõikjal, välja arvatud kerjamisel.

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

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

Selle kontrollimiseks käivitage ‘ls -l’:

$ 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

Mis juhtub, kui loote korraga kaks faili (ütleme a ja #bc):

$ touch a.txt #bc.txt

Kontrollige äsja loodud faili:

$ ls -l

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

Ülaltoodud näite põhjal on ilmselge, et see lõi ainult faili a ja faili #bc on ignoreeritud. Eespool nimetatud olukorra edukaks täitmiseks saame seda teha,

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

ja kontrollige seda järgmiselt:

$ 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

Faili saate teisaldada järgmiselt:

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

Kopeerige see järgmiselt:

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

Võite seda redigeerida nii, et kasutate valitud redaktorit järgmiselt:

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

Ja kustutage see järgmiselt:

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

Kõigi failide kustutamiseks, mille failinimes on räsi (#), võite kasutada järgmist.

 # rm ./#*

Failidega tegelemine, mille nimes on semikoolon (;)

Kui te pole sellest teadlik, toimib semikoolon BASH-is käsueraldajana ja võib-olla ka muus shellis. Semikoolon võimaldab teil korraga täita mitu käsku ja toimib eraldajana. Kas olete kunagi tegelenud mõne failinimega, kus on semikoolon? Kui ei, siis siin.

Looge fail, milles on semikoolon.

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

Eeltoodud tõrke põhjuseks on see, et kui käivitate ülaltoodud käsu, tõlgendab BASH puutetundlikkust käsuna, kuid ei leidnud enne semikooloni ühtegi faili operandi ja seega teatab see veast. Samuti teatatakse teisest veast, mida käsku 'abc.txt' ei leitud, vaid seetõttu, et pärast semikoolonit ei oodanud BASH veel üht käsku ja 'abc.txt'.

Sellise tõrke lahendamiseks öelge BASH-il, et ta ei tõlgenda semikoolonit käskude eraldajana järgmiselt:

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

Märkus. Oleme failinime lisanud ühe jutumärgiga . See ütleb BASH-ile, et ; on failinime osa, mitte käskude eraldaja.

Ülejäänud toimingu (st kopeerimine, teisaldamine, kustutamine) failis ja kaustas, mille nimi on semikoolon, saab teha otse, lisades nime ühte jutumärki.

Muude erimärkide käsitlemine faili/kausta nimes

Ära vaja midagi täiendavat, lihtsalt tehke seda tavalisel viisil, nii lihtsa failinimega, nagu allpool näidatud.

$ touch +12.txt 

Failinimi tuleb lisada ühe jutumärgiga, nagu tegime semikooloniga. Ülejäänud asjad on otse edasi ..

$ touch '$12.txt'

Teil pole vaja midagi muud teha, käsitlege seda tavalise failina.

$ touch %12.txt

Tärniga failinimes muutmine ei muuda midagi ja saate seda jätkata tavalise failina.

$ touch *12.txt

Märkus. Kui peate kustutama faili, mis algab tähega * , ärge kunagi kasutage selliste failide kustutamiseks järgmisi käske.

$ rm *
or
$ rm -rf *

Selle asemel kasutage

$ rm ./*.txt

Lihtsalt lisage failinimi ühte jutumärki ja ülejäänud asjad on samad.

$ touch '!12.txt'

Midagi ekstra, käsitlege failinime, millel At Sign on mitteoluline fail.

$ touch '@12.txt'

Lisatähelepanu pole vaja. Kasutage faili, mille failinimes on ^ tavalise failina.

$ touch ^12.txt

Failinimi peaks olema suletud üksikutesse jutumärkidesse ja olete valmis minema.

$ touch '&12.txt'

Kui failinimel on sulg, peate failinime lisama üksikute jutumärkidega.

$ touch '(12.txt)'

Lisahooldust pole vaja. Käsitlege seda lihtsalt teise failina.

$ touch {12.txt}

Chevronitega failinimi tuleb lisada jutumärkidesse.

$ touch '<12.txt>'

Käsitlege nurksulgudega failinime tavaliste failidena ja te ei pea selle eest eriti hoolt kandma.

$ touch [12.txt]

Need on väga levinud ja ei vaja midagi täiendavat. Lihtsalt tehke seda, mida oleksite teinud tavalise failiga.

$ touch _12.txt

Kui teil on võrdusmärk, ei muuda see midagi, saate seda kasutada tavalise failina.

$ touch =12.txt

Backslash käsib shellil järgmist märki ignoreerida. Failinimi tuleb lisada ühe jutumärgiga, nagu tegime semikooloniga. Ülejäänud asjad on otse edasi.

$ touch '.txt'

Enne kui failisüsteemis on viga, ei saa luua faili, mille nimi sisaldab ka kaldkriipsu (/) . Kaldkriipsust ei pääse kuidagi.

Nii et kui saate luua sellise faili nagu '/12.txt' või 'b/c.txt', siis kas teie failisüsteemis on viga või teil on Unicode'i tugi, mis võimaldab teil luua kaldkriipsuga faili. Sel juhul ei ole ettepoole suunatud kaldkriips päris tegelik ettepoole suunatud kaldkriips, vaid Unicode'i märk, mis näeb välja sarnane kaldkriips.

Jällegi näide, kus teil pole vaja erilisi katseid teha. Küsimärgiga failinime saab käsitleda kõige üldisemalt.

$ touch ?12.txt

Punktiga (.) algavad failid on Linuxis väga erilised ja neid nimetatakse punktfailideks. Need on peidetud failid, tavaliselt konfiguratsiooni- või süsteemifailid. Selliste failide vaatamiseks peate kasutama ls-ga käsku '-a' või '-A'.

Selliste failide loomine, muutmine, ümbernimetamine ja kustutamine on lihtne.

$ touch .12.txt

Märkus: Linuxis võib teil olla nii palju punkte (.) kui vajate failinimes. Erinevalt teistest failinime süsteemipunktidest ei tähenda see nime ja laiendi eraldamist. Mitme punktiga faili saate luua järgmiselt:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

ja kontrollige seda järgmiselt:

$ 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

Failinimes võib olla koma nii palju kui soovite ja te ei vaja midagi täiendavat. Lihtsalt tehke seda tavalisel viisil, lihtsa failinimena.

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

Failinimes võib olla koolon, nii palju kui soovite, ja te ei vaja midagi täiendavat. Lihtsalt tehke seda tavalisel viisil, lihtsa failinimena.

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

Tsitaatide pakkumiseks failinimes peame kasutama vahetuse reeglit. St kui teil on failinimes vaja ühte pakkumist, lisage failinimi topeltpakkumistega ja kui teil on vaja topeltpakkumisi failinimes, lisage see ühe jutumärgiga.

$ touch "15'.txt"

and

$ touch '15”.txt'

Mõned Linuxi redaktorid, näiteks emacs, loovad redigeeritava faili varukoopia. Varukoopiafailil on algse faili nimi pluss faili nime lõpus tilde. Teil võib olla fail, mille nimi sisaldab tildet, mis tahes kohas lihtsalt järgmiselt:

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

Looge fail, mille nimel on märgi/sõna vahel ruumi, öelge\"tere, mu nimi on avishek.txt".

Ei ole hea, kui failinimel on tühikud ja kui peate eristama loetavat nime, peaksite seda kasutama, alla kriipsutama või kriipsuga. Kuid kui peate sellise faili looma, peate kasutama tahapoole kaldkriipsu, mis ignoreerib selle järgmist märki. Ülaloleva faili loomiseks peame seda tegema nii.

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

hi my name is avishek.txt

Olen proovinud kajastada kõiki stsenaariume, millega võite kokku puutuda. Enamik ülaltoodud rakendusi on selgesõnaliselt BASH Shelli jaoks ja ei pruugi mõnes teises kestas töötada.

Kui tunnete, et mul jäi millestki puudu (see on väga levinud ja inimlik loomus), võite lisada oma soovituse allpool toodud kommentaaridesse. Hoidke ühendust, jätkake kommenteerimist. Püsige lainel ja ühenduses! Meeldib ja jaga meid ning aita meil levida!