Πώς να χειριστείτε ονόματα αρχείων που έχουν κενά και ειδικούς χαρακτήρες στο Linux


Συναντάμε ονόματα αρχείων και φακέλων πολύ τακτικά. Στις περισσότερες περιπτώσεις, το όνομα αρχείου/φακέλου σχετίζεται με το περιεχόμενο του αρχείου/φακέλου και ξεκινά με αριθμό και χαρακτήρες. Το αλφαριθμητικό όνομα αρχείου είναι αρκετά κοινό και χρησιμοποιείται ευρέως, αλλά αυτό δεν συμβαίνει όταν έχουμε να κάνουμε με όνομα αρχείου/φακέλου που έχει ειδικούς χαρακτήρες.

Σημείωση: Μπορούμε να έχουμε αρχεία οποιουδήποτε τύπου, αλλά για απλότητα και εύκολη εφαρμογή θα έχουμε να κάνουμε με αρχείο κειμένου (.txt), σε όλο το άρθρο.

Παραδείγματα των πιο κοινών ονομάτων αρχείων είναι:

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

Παραδείγματα ονομάτων αριθμητικών αρχείων είναι:

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

Παραδείγματα αλφαριθμητικών ονομάτων αρχείων είναι:

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

Παραδείγματα ονομάτων αρχείων που έχουν ειδικό χαρακτήρα και δεν είναι πολύ συνηθισμένα:

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

Ένα από τα πιο προφανή ερωτήματα εδώ είναι – ποιος στη γη δημιουργεί/διαχειρίζεται το όνομα αρχείων/φακέλων με Hash (#), άνω τελεία (;), παύλα (-) ή οποιονδήποτε άλλο ειδικό χαρακτήρα.

Συμφωνώ μαζί σας ότι τέτοια ονόματα αρχείων δεν είναι κοινά, ωστόσο το κέλυφός σας δεν πρέπει να σπάσει/παραιτηθεί όταν πρέπει να αντιμετωπίσετε τέτοια ονόματα αρχείων. Επίσης, μιλώντας τεχνικά, κάθε πράγμα είτε είναι φάκελος, πρόγραμμα οδήγησης ή οτιδήποτε άλλο αντιμετωπίζεται ως αρχείο στο Linux.

Αντιμετώπιση αρχείου που έχει παύλα (-) στο όνομά του

Δημιουργήστε ένα αρχείο που ξεκινά με μια παύλα (-), ας πούμε -abx.txt.

$ touch -abc.txt
Δείγμα εξόδου
touch: invalid option -- 'b'
Try 'touch --help' for more information.

Ο λόγος για το παραπάνω σφάλμα, ότι το κέλυφος ερμηνεύει οτιδήποτε μετά από μια παύλα (-), ως επιλογή, και προφανώς δεν υπάρχει τέτοια επιλογή, επομένως είναι το σφάλμα.

Για να επιλύσουμε ένα τέτοιο σφάλμα, πρέπει να πούμε στο κέλυφος Bash (ναι, αυτό και τα περισσότερα από τα άλλα παραδείγματα στο άρθρο είναι για το BASH) να μην ερμηνεύει τίποτα μετά από ειδικό χαρακτήρα (εδώ παύλα), ως επιλογή.

Υπάρχουν δύο τρόποι επίλυσης αυτού του σφάλματος ως εξής:

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

Μπορείτε να επαληθεύσετε το αρχείο που δημιουργήθηκε με αυτόν τον τρόπο και με τους δύο παραπάνω τρόπους εκτελώντας τις εντολές ls ή ls -l για μεγάλη λίστα.

$ ls -l

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

Για να επεξεργαστείτε το παραπάνω αρχείο μπορείτε να κάνετε:

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

Σημείωση: Μπορείτε να αντικαταστήσετε το nano με οποιοδήποτε άλλο πρόγραμμα επεξεργασίας της επιλογής σας, πείτε vim ως:

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

Ομοίως για να μετακινήσετε ένα τέτοιο αρχείο πρέπει να κάνετε:

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

και για να διαγράψετε αυτό το αρχείο, πρέπει να κάνετε:

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

Εάν έχετε πολλά αρχεία σε έναν φάκελο το όνομα του οποίου περιέχει παύλα και θέλετε να τα διαγράψετε όλα ταυτόχρονα, κάντε τα εξής:

$ rm ./-*

1. Ο ίδιος κανόνας που συζητήθηκε παραπάνω ακολουθεί για οποιονδήποτε αριθμό διαφημιστικών κειμένων στο όνομα του αρχείου και την εμφάνισή τους. Δηλαδή, -a-b-c.txt, ab-c.txt, abc-.txt κ.λπ.

2. Ο ίδιος κανόνας που συζητήθηκε παραπάνω ακολουθεί για το όνομα του φακέλου με οποιονδήποτε αριθμό hypen και την εμφάνισή τους, εκτός από το γεγονός ότι για τη διαγραφή του φακέλου πρέπει να χρησιμοποιήσετε 'rm -rf ' ως:

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

Αντιμετώπιση αρχείων που έχουν HASH (#) στο όνομα

Το σύμβολο # έχει πολύ διαφορετική σημασία στο BASH. Οτιδήποτε μετά από ένα # ερμηνεύεται ως σχόλιο και ως εκ τούτου παραμελείται από την BASH.

δημιουργήστε ένα αρχείο #abc.txt.

$ touch #abc.txt
Δείγμα εξόδου
touch: missing file operand
Try 'touch --help' for more information.

Ο λόγος για το παραπάνω σφάλμα είναι ότι ο Bash ερμηνεύει το #abc.txt ένα σχόλιο και ως εκ τούτου αγνοεί. Έτσι, η εντολή touch έχει περάσει χωρίς κανένα αρχείο Operand, και ως εκ τούτου είναι το σφάλμα.

Για να επιλύσετε ένα τέτοιο σφάλμα, μπορείτε να ζητήσετε από την BASH να μην ερμηνεύσει το # ως σχόλιο.

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

και επαληθεύστε το αρχείο που μόλις δημιουργήθηκε ως:

$ ls -l

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

Τώρα δημιουργήστε ένα αρχείο το όνομα του οποίου να περιέχει # οπουδήποτε εκτός από την αρχή.

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

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

Εκτελέστε το ‘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

Τι συμβαίνει όταν δημιουργείτε δύο αρχεία (π.χ. a και #bc) ταυτόχρονα:

$ touch a.txt #bc.txt

Επαληθεύστε το αρχείο που μόλις δημιουργήθηκε:

$ ls -l

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

Προφανώς από το παραπάνω παράδειγμα δημιούργησε μόνο το αρχείο a και το αρχείο #bc αγνοήθηκε. Για την επιτυχή εκτέλεση της παραπάνω κατάστασης μπορούμε να κάνουμε,

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

και επαληθεύστε το ως:

$ 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

Μπορείτε να μετακινήσετε το αρχείο ως:

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

Αντιγράψτε το ως:

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

Μπορείτε να το επεξεργαστείτε χρησιμοποιώντας τον επεξεργαστή της επιλογής σας ως:

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

Και διαγράψτε το ως:

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

Για να διαγράψετε όλα τα αρχεία που έχουν κατακερματισμό (#) στο όνομα του αρχείου, μπορείτε να χρησιμοποιήσετε:

 # rm ./#*

Αντιμετώπιση αρχείων με ερωτηματικό (;) στο όνομά του

Σε περίπτωση που δεν το γνωρίζετε, το ερωτηματικό λειτουργεί ως διαχωριστικό εντολών στο BASH και ίσως και σε άλλο κέλυφος. Το ερωτηματικό σάς επιτρέπει να εκτελέσετε πολλές εντολές με μια κίνηση και λειτουργεί ως διαχωριστικό. Έχετε ασχοληθεί ποτέ με κάποιο όνομα αρχείου με ερωτηματικό; Αν όχι εδώ θα το κάνεις.

Δημιουργήστε ένα αρχείο με άνω και κάτω τελεία.

$ touch ;abc.txt
Δείγμα εξόδου
touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

Ο λόγος για το παραπάνω σφάλμα είναι ότι όταν εκτελείτε την παραπάνω εντολή, το BASH ερμηνεύει το touch ως εντολή αλλά δεν μπόρεσε να βρει κανέναν τελεστή αρχείου πριν από το ερωτηματικό και ως εκ τούτου αναφέρει σφάλμα. Αναφέρει επίσης ένα άλλο σφάλμα ότι η εντολή abc.txt δεν βρέθηκε, μόνο επειδή μετά το ερωτηματικό BASH περίμενε άλλη εντολή και το abc.txt, δεν είναι εντολή.

Για να επιλύσετε ένα τέτοιο σφάλμα, πείτε στο BASH να μην ερμηνεύει το ερωτηματικό ως διαχωριστικό εντολών, όπως:

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

Σημείωση: Έχουμε περικλείσει το όνομα του αρχείου με ένα μόνο εισαγωγικό . Λέει στην BASH ότι το ; είναι μέρος του ονόματος αρχείου και όχι διαχωριστικό εντολών.

Η υπόλοιπη ενέργεια (δηλαδή, αντιγραφή, μετακίνηση, διαγραφή) στο αρχείο και στο φάκελο που έχει ερωτηματικό στο όνομά του μπορεί να πραγματοποιηθεί απευθείας, κλείνοντας το όνομα σε ένα μόνο εισαγωγικό.

Αντιμετώπιση άλλων ειδικών χαρακτήρων στο όνομα αρχείου/φακέλου

Plus Sign (+) στο όνομα αρχείου

Δεν απαιτεί τίποτα επιπλέον, απλώς κάντε το με κανονικό τρόπο, τόσο απλό όνομα αρχείου όπως φαίνεται παρακάτω.

$ touch +12.txt 

Σύμβολο δολαρίου ($) στο όνομα αρχείου

Πρέπει να εσωκλείσετε το όνομα αρχείου σε μονό εισαγωγικό, όπως κάναμε στην περίπτωση του ερωτηματικού. Τα υπόλοιπα είναι ευθεία..

$ touch '$12.txt'

Ποσοστό (%) στο όνομα αρχείου

Δεν χρειάζεται να κάνετε κάτι διαφορετικό, αντιμετωπίστε το ως κανονικό αρχείο.

$ touch %12.txt

Αστερίσκος (*) στο όνομα αρχείου

Έχοντας το Asterisk στο όνομα αρχείου δεν αλλάζει τίποτα και μπορείτε να συνεχίσετε να το χρησιμοποιείτε ως κανονικό αρχείο.

$ touch *12.txt

Σημείωση: Όταν πρέπει να διαγράψετε ένα αρχείο που ξεκινά με *, μην χρησιμοποιείτε ποτέ τις ακόλουθες εντολές για να διαγράψετε τέτοια αρχεία.

$ rm *
or
$ rm -rf *

Αντί για χρήση,

$ rm ./*.txt

Θαυμαστικό (!) στο όνομα αρχείου

Απλώς περικλείστε το όνομα του αρχείου σε ένα μόνο εισαγωγικό και τα υπόλοιπα πράγματα είναι ίδια.

$ touch '!12.txt'

Στο Sign (@) στο όνομα αρχείου

Τίποτα επιπλέον, αντιμετωπίστε ένα όνομα αρχείου που έχει At Sign ως μη τυπικό αρχείο.

$ touch '@12.txt'

^στο όνομα αρχείου

Δεν απαιτείται επιπλέον προσοχή. Χρησιμοποιήστε ένα αρχείο που έχει ^ στο όνομα αρχείου ως κανονικό αρχείο.

$ touch ^12.txt

Συμφωνητικό (&) στο όνομα αρχείου

Το όνομα αρχείου πρέπει να περικλείεται σε μονά εισαγωγικά και είστε έτοιμοι να ξεκινήσετε.

$ touch '&12.txt'

Παρενθέσεις() στο όνομα αρχείου

Εάν το όνομα αρχείου έχει παρένθεση, πρέπει να περικλείσετε το όνομα αρχείου με μονά εισαγωγικά.

$ touch '(12.txt)'

Αγκύλες {} στο όνομα αρχείου

Δεν χρειάζεται επιπλέον φροντίδα. Απλώς αντιμετωπίστε το ως ένα άλλο αρχείο.

$ touch {12.txt}

Chevron στο όνομα αρχείου

Ένα όνομα αρχείου με Chevrons πρέπει να περικλείεται σε μονά εισαγωγικά.

$ touch '<12.txt>'

Τετράγωνες αγκύλες [ ] στο όνομα αρχείου

Αντιμετωπίστε το όνομα αρχείου που έχει τετράγωνες αγκύλες ως κανονικά αρχεία και δεν χρειάζεται να το προσέχετε ιδιαίτερα.

$ touch [12.txt]

Κάτω από τη βαθμολογία (_) στο όνομα αρχείου

Είναι πολύ κοινά και δεν απαιτούν τίποτα επιπλέον. Απλώς κάντε αυτό που θα κάνατε με ένα κανονικό αρχείο.

$ touch _12.txt

Ίσο με (=) στο όνομα αρχείου

Έχοντας ένα σύμβολο Equal-to δεν αλλάζει τίποτα, μπορείτε να το χρησιμοποιήσετε ως κανονικό αρχείο.

$ touch =12.txt

Αντιμετώπιση πίσω κάθετου (\)

Η ανάστροφη κάθετο λέει στον κέλυφος να αγνοήσει τον επόμενο χαρακτήρα. Πρέπει να εσωκλείσετε το όνομα αρχείου σε μονό εισαγωγικό, όπως κάναμε στην περίπτωση του ερωτηματικού. Τα υπόλοιπα είναι ευθεία.

$ touch '.txt'

The Special Case of Forward Slash

Δεν μπορείτε να δημιουργήσετε ένα αρχείο το όνομα του οποίου να περιλαμβάνει κάθετο (/), έως ότου το σύστημα αρχείων σας παρουσιάσει σφάλμα. Δεν υπάρχει τρόπος να ξεφύγεις από μια κάθετο προς τα εμπρός.

Επομένως, εάν μπορείτε να δημιουργήσετε ένα αρχείο όπως '/12.txt' ή 'b/c.txt' τότε είτε το σύστημα αρχείων σας έχει σφάλμα είτε έχετε υποστήριξη Unicode, που σας επιτρέπει να δημιουργήσετε ένα αρχείο με κάθετο προς τα εμπρός. Σε αυτήν την περίπτωση, η κάθετο προς τα εμπρός δεν είναι μια πραγματική κάθετο προς τα εμπρός, αλλά ένας χαρακτήρας Unicode που μοιάζει με κάθετο προς τα εμπρός.

Ερωτηματικό (?) στο όνομα αρχείου

Και πάλι, ένα παράδειγμα όπου δεν χρειάζεται να κάνετε καμία ειδική προσπάθεια. Ένα όνομα αρχείου που έχει ερωτηματικό μπορεί να αντιμετωπιστεί με τον πιο γενικό τρόπο.

$ touch ?12.txt

Σημάδι κουκκίδας (.) στο όνομα αρχείου

Τα αρχεία που ξεκινούν με τελεία (.) είναι πολύ ειδικά στο Linux και ονομάζονται dot files. Είναι κρυφά αρχεία γενικά αρχεία διαμόρφωσης ή συστήματος. Πρέπει να χρησιμοποιήσετε το διακόπτη -a ή -A με την εντολή ls για να προβάλετε τέτοια αρχεία.

Η δημιουργία, η επεξεργασία, η μετονομασία και η διαγραφή τέτοιων αρχείων είναι απλή.

$ touch .12.txt

Σημείωση: Στο Linux μπορεί να έχετε όσες κουκκίδες (.) χρειάζεστε σε ένα όνομα αρχείου. Σε αντίθεση με άλλες κουκκίδες συστήματος στο όνομα αρχείου, δεν σημαίνει ότι ο διαχωρισμός ονόματος και επέκτασης. Μπορείτε να δημιουργήσετε ένα αρχείο με πολλές τελείες ως:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

και ελέγξτε το ως:

$ 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

Κόμμα (,) στο όνομα αρχείου

Μπορείτε να έχετε κόμμα σε ένα όνομα αρχείου, όσα θέλετε και δεν χρειάζεστε τίποτα επιπλέον. Απλώς κάντε το με κανονικό τρόπο, ως απλό όνομα αρχείου.

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

Άνω τελεία (:) στο όνομα αρχείου

Μπορείτε να έχετε άνω και κάτω τελεία σε ένα όνομα αρχείου, όσα θέλετε και δεν χρειάζεστε τίποτα επιπλέον. Απλώς κάντε το με κανονικό τρόπο, ως απλό όνομα αρχείου.

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

Έχοντας εισαγωγικά (μονά και διπλά) στο όνομα αρχείου

Για να έχουμε προσφορές στο όνομα αρχείου, πρέπει να χρησιμοποιήσουμε τον κανόνα ανταλλαγής. Δηλαδή, εάν πρέπει να έχετε ένα εισαγωγικό στο όνομα αρχείου, περικλείστε το όνομα του αρχείου με διπλά εισαγωγικά και εάν θέλετε να έχετε διπλό εισαγωγικό στο όνομα αρχείου, περικλείστε το με ένα μόνο εισαγωγικό.

$ touch "15'.txt"

and

$ touch '15”.txt'

Tilde (~) στο όνομα αρχείου

Ορισμένοι επεξεργαστές στο Linux, όπως το emacs δημιουργούν ένα αρχείο αντιγράφου ασφαλείας του αρχείου που επεξεργάζεται. Το αρχείο αντιγράφου ασφαλείας έχει το όνομα του αρχικού αρχείου συν μια περισπωμένη στο τέλος του ονόματος αρχείου. Μπορείτε να έχετε ένα αρχείο το όνομα του οποίου περιλαμβάνει tilde, σε οποιαδήποτε τοποθεσία, απλά ως:

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

Λευκό διάστημα στο όνομα αρχείου

Δημιουργήστε ένα αρχείο το όνομα του οποίου έχει κενό διάστημα μεταξύ χαρακτήρα/λέξης, πείτε \γεια, το όνομά μου είναι avishek.txt”.

Δεν είναι καλή ιδέα να έχετε το όνομα αρχείου με κενά και αν πρέπει να διακρίνετε ευανάγνωστο όνομα, θα πρέπει να χρησιμοποιήσετε, υπογράμμιση ή παύλα. Ωστόσο, εάν πρέπει να δημιουργήσετε ένα τέτοιο αρχείο, πρέπει να χρησιμοποιήσετε κάθετο προς τα πίσω που αγνοεί τον επόμενο χαρακτήρα σε αυτό. Για να δημιουργήσουμε το παραπάνω αρχείο πρέπει να το κάνουμε με αυτόν τον τρόπο..

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

hi my name is avishek.txt

Προσπάθησα να καλύψω όλα τα σενάρια που μπορεί να συναντήσετε. Οι περισσότερες από τις παραπάνω εφαρμογές είναι ρητά για το BASH Shell και ενδέχεται να μην λειτουργούν σε άλλο κέλυφος.

Αν πιστεύετε ότι έχασα κάτι (που είναι πολύ συνηθισμένο και στην ανθρώπινη φύση), μπορείτε να συμπεριλάβετε την πρότασή σας στα παρακάτω σχόλια. Μείνετε συνδεδεμένοι, συνεχίστε να σχολιάζετε. Μείνετε συντονισμένοι και συνδεδεμένοι! Κάντε Like και κοινοποιήστε μας και βοηθήστε μας να διαδοθούμε!