Πώς να αντιμετωπίσετε τα κενά σε ονόματα αρχείων στο Linux
Βασικά Takeaways
Εάν έχετε ένα όνομα αρχείου με κενά σε ένα σύστημα Linux, η αναδίπλωση του ονόματος αρχείου σας σε εισαγωγικά επιτρέπει στο Bash να το χειριστεί σωστά. Η ολοκλήρωση της καρτέλας καθιστά εύκολη την εισ
αγωγή
ονομάτων αρχείων στη γραμμή εντολών, ακόμα κι αν περιέχουν κενά.
Όπως τα περισσότερα λειτουργικά συστήματα, το Linux υποστηρίζει ονόματα αρχείων με κενά. Αλλά η χρήση αυτών των ονομάτων αρχείων στη γραμμή εντολών δεν είναι πάντα απλή. Ακολουθούν διάφοροι τρόποι με τους οποίους μπορείτε να χειριστείτε ονόματα αρχείων που περιέχουν κενά.
Πώς λειτουργούν τα ονόματα αρχείων Linux;
Όλα όσα είναι αποθηκευμένα στον σκληρό δίσκο του υπολογιστή σας πρέπει να έχουν όνομα. Χωρίς όνομα, δεν θα υπήρχαν αρχεία. Όλες οι εφαρμογές και οι δαίμονες που εκκινούνται κατά την εκκίνηση του υπολογιστή σας και όλο το λογισμικό που χρησιμοποιείτε, πρέπει να αναγνωριστούν και να αποθηκευτούν σε ένα σύστημα αρχείων. Αυτή η αναγνώριση είναι το όνομα του αρχείου.
Το ίδιο ισχύει και για τα αρχεία που δημιουργείτε ή εγκαθιστάτε. Όλα τα έγγραφα, οι εικόνες και η μουσική σας χρειάζονται ονόματα αρχείων. Χωρίς ονόματα αρχείων, κανένα από τα ψηφιακά σας στοιχεία δεν θα μπορούσε να υπάρξει. Επειδή τα ονόματα αρχείων είναι τόσο σημαντικά, το Linux προσπαθεί σκληρά να επιβάλει όσο το δυνατόν λιγότερους κανόνες σχετικά με τη σύνθεσή τους.
Στο Linux, ένα όνομα αρχείου μπορεί να περιέχει οποιονδήποτε χαρακτήρα εκτός από την κάθετο “/” και τον μηδενικό χαρακτήρα, 0x00. Ο χαρακτήρας null χρησιμοποιείται για να επισημάνει το τέλος μιας συμβολοσειράς, επομένως δεν μπορεί να υπάρχει στην ίδια τη συμβολοσειρά, διαφορετικά το Linux θα περικόψει το όνομα αρχείου στη θέση του μηδενικού χαρακτήρα. Η κάθετο “/” χρησιμοποιείται ως διαχωριστικό στις διαδρομές καταλόγου.
Τα ονόματα αρχείων κάνουν διάκριση πεζών-κεφαλαίων,
και μπορεί να έχει μήκος έως 255 byte
, συμπεριλαμβανομένου του μηδενικού χαρακτήρα. Οι διαδρομές καταλόγου μπορούν να έχουν μήκος έως και 4096 byte, συμπεριλαμβανομένου του μηδενικού χαρακτήρα. Σημειώστε ότι αυτό είναι το μήκος τους σε byte, το οποίο μπορεί να μην ισοδυναμεί απευθείας με χαρακτήρες. Οι χαρακτήρες Unicode 16-bit, για παράδειγμα, παίρνουν δύο byte ο καθένας.
Οι λάτρεις των ρετρό υπολογιστών και όσοι έχουν μακριές μνήμες θα γνωρίζουν ότι στις πρώτες μέρες των προσωπικών υπολογιστών,
Λειτουργικό Σύστημα Δίσκου της Microsoft
DOS, δεν είχε διάκριση πεζών-κεφαλαίων και είχε όριο ονόματος αρχείου οκτώ χαρακτήρων, συν μια επέκταση τριών χαρακτήρων.
Έπρεπε να είστε πολύ στοχαστικοί και μερικές φορές δημιουργικοί όταν ονομάζατε αρχεία. Συγκριτικά, η ελευθερία που έχουμε σήμερα σημαίνει ότι μπορούμε να ονομάζουμε αρχεία ό,τι θέλουμε, χωρίς να σκεφτόμαστε τίποτα άλλο εκτός από την περιγραφή που δημιουργούμε για αυτό το αρχείο.
Αλλά με τα ονόματα αρχείων, αυτό που μας παραξενεύει πιο συχνά δεν είναι οι χαρακτήρες που πληκτρολογούμε, είναι τα κενά μεταξύ τους.
Γιατί τα κενά στα ονόματα αρχείων Linux είναι ένας πόνος
Κελύφη όπως το Bash θα ερμηνεύσουν μια συμβολοσειρά λέξεων διαχωρισμένων με κενό διάστημα ως μεμονωμένα ορίσματα εντολών και όχι ως ένα όρισμα. Εδώ είναι ένα παράδειγμα, χρησιμοποιώντας
touch
για να δημιουργήσετε ένα νέο αρχείο που ονομάζεται “το νέο μου αρχείο.txt.”
touch my new file.txt
ls
Οπως μπορούμε να δούμε,
ls
μας δείχνει ότι δημιουργήθηκαν τρία αρχεία, ένα με το όνομα “my”, ένα άλλο με το όνομα “new” και ένα ακόμη με το όνομα “file.txt”.
Σημειώστε ότι
touch
δεν παραπονέθηκε ούτε έκανε λάθος. Εκτελεί αυτό που πιστεύει ότι του ζητάμε να κάνει. Έτσι μας επιστρέφει αθόρυβα στη γραμμή εντολών. Εάν δεν έχουμε κίνητρο να ελέγξουμε, δεν θα ξέρουμε ότι τα πράγματα δεν πήγαν σύμφωνα με το σχέδιο.
Για να δημιουργήσουμε το αρχείο που θέλαμε, πρέπει να κάνουμε παράθεση ή να διαφύγουμε.
Τρόπος προσφοράς και διαφυγής διαστημάτων
Αν αναφέρουμε ολόκληρο το όνομα αρχείου,
touch
γνωρίζει ότι πρέπει να αντιμετωπίζει το παρατιθέμενο κείμενο ως ένα ενιαίο όρισμα.
touch 'my new file.txt'
ls
Αυτή τη φορά έχουμε το μοναδικό αρχείο που περιμένουμε.
Μπορούμε να έχουμε το ίδιο αποτέλεσμα αν χρησιμοποιήσουμε τον χαρακτήρα ανάστροφης κάθετο “
” για να ξεφύγουν από τα κενά. Με το να “ξεφύγουν” από τα κενά δεν αντιμετωπίζονται ως ειδικοί χαρακτήρες — δηλαδή διαχωριστές επιχειρημάτων — θεωρούνται απλοί παλιοί χώροι.
touch my second new file.txt
ls
Αυτό λειτουργεί, αλλά η διαφυγή διαστημάτων κάνει την πληκτρολόγηση ονομάτων αρχείων πιο αργή και επιρρεπή σε σφάλματα. Τα πράγματα μπορεί να γίνουν πολύ άσχημα αν έχετε και ονόματα καταλόγων με κενά.
cp dir one/my text file.txt dir two/my text file.bak
ls
Αυτή η εντολή αντιγράφει ένα μεμονωμένο αρχείο κειμένου από έναν κατάλογο που ονομάζεται “dir one” σε έναν κατάλογο που ονομάζεται “dir two” και αποθηκεύει το αντίγραφο ως αρχείο BAK. Και είναι ένα αρκετά απλό παράδειγμα.
Πώς να διορθώσετε το
πρόβλημα
του χώρου στην πηγή του
Εάν είναι τα δικά σας αρχεία, θα μπορούσατε να λάβετε την πολιτική απόφαση να μην χρησιμοποιήσετε ποτέ κενά και να δημιουργήσετε (ή μαζική μετονομασία) ονομάτων αρχείων όπως αυτό.
mynewtextfile.txt
Ομολογουμένως, αυτή είναι μια ισχυρή λύση, αλλά εξακολουθεί να είναι άσχημη. Υπάρχουν καλύτερες επιλογές, όπως η χρήση παύλων “
-
“ή υπογραμμίζει”
_
«για να χωρίσω τα λόγια σου.
my-new-text-file.txt
my_new_text_file.txt
Και τα δύο θα παρακάμψουν το πρόβλημα και είναι ευανάγνωστα. Εάν δεν θέλετε να προσθέσετε επιπλέον χαρακτήρες στα ονόματα των αρχείων σας, μπορείτε να χρησιμοποιήσετε
CamelCase
για να κάνετε τα ονόματα των αρχείων σας αναγνώσιμα, ως εξής:
MyNewTextFile.txt
Η επέκταση καρτελών διευκολύνει την αντιμετώπιση των χώρων
Φυσικά, η υιοθέτηση μιας σύμβασης ονομασίας και η τήρηση της θα βοηθήσει μόνο όταν ασχολείστε με τα δικά σας αρχεία. Τα αρχεία που προέρχονται από οπουδήποτε αλλού είναι απίθανο να ακολουθούν τη σύμβαση ονομασίας που έχετε υιοθετήσει.
Μπορείτε να χρησιμοποιήσετε την επέκταση καρτέλας για να σας βοηθήσει να “συμπληρώσετε” με ακρίβεια τα ονόματα αρχείων για εμάς. Ας πούμε ότι θέλουμε να διαγράψουμε το αρχείο BAK που δημιουργήσαμε στο “dir two”, χρησιμοποιώντας
rm
.
Ξεκινάμε πληκτρολογώντας “rm dir” επειδή χρησιμοποιούμε το
rm
εντολή και γνωρίζουμε ότι το όνομα του καταλόγου ξεκινά με “dir.”
rm dir
Πατώντας το πλήκτρο “Tab” το Bash πραγματοποιεί σάρωση για αντιστοιχίσεις στον τρέχοντα κατάλογο.
Υπάρχουν δύο κατάλογοι που ξεκινούν με “dir”, και στις δύο περιπτώσεις ο επόμενος χαρακτήρας είναι ένα κενό. Έτσι ο Bash προσθέτει τον χαρακτήρα ανάστροφης κάθετου “
” και ένα διάστημα. Στη συνέχεια, το Bash περιμένει να παρέχουμε τον επόμενο χαρακτήρα. Χρειάζεται τον επόμενο χαρακτήρα για να διαφοροποιήσει τις δύο πιθανές αντιστοιχίσεις σε αυτόν τον κατάλογο.
Θα πληκτρολογήσουμε ένα “t”, για “δύο”, και στη συνέχεια θα πατήσουμε “Tab” άλλη μια φορά.
Το Bash συμπληρώνει το όνομα του καταλόγου για εμάς και περιμένει να πληκτρολογήσουμε την αρχή του ονόματος αρχείου.
Έχουμε μόνο ένα αρχείο σε αυτόν τον κατάλογο, οπότε πληκτρολογώντας το πρώτο γράμμα του ονόματος αρχείου, “m”, είναι αρκετό για να ενημερώσουμε τον Bash ποιο αρχείο θέλουμε να χρησιμοποιήσουμε. Πληκτρολογώντας “m” και πατώντας “Tab” ολοκληρώνεται το όνομα αρχείου για εμάς και το “Enter” εκτελεί ολόκληρη την εντολή.
Η επέκταση της καρτέλας διευκολύνει τη διασφάλιση ότι λαμβάνετε σωστά τα ονόματα αρχείων και επίσης επιταχύνει την πλοήγηση και την πληκτρολόγηση στη γραμμή εντολών γενικά.
Πώς να χρησιμοποιήσετε ονόματα αρχείων με κενά σε σενάρια Bash
Δεν αποτελεί έκπληξη το γεγονός ότι τα σενάρια έχουν ακριβώς τα ίδια προβλήματα με τα κενά στα ονόματα αρχείων με τη γραμμή εντολών. Εάν μεταβιβάζετε ένα όνομα αρχείου ως μεταβλητή, φροντίστε να αναφέρετε το όνομα της μεταβλητής.
Αυτό το μικρό σενάριο ελέγχει τον τρέχοντα κατάλογο για αρχεία που ταιριάζουν με το μοτίβο αρχείων “*.txt” και τα αποθηκεύει σε μια μεταβλητή που ονομάζεται
file_list
. ΕΝΑ
for
Ο
βρόχος
χρησιμοποιείται για να εκτελέσει μια απλή
ενέργεια
σε κάθε ένα.
#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone
Αντιγράψτε αυτό το κείμενο σε ένα πρόγραμμα επεξ
εργασία
ς και αποθηκεύστε το σε ένα αρχείο που ονομάζεται “files.sh”. Στη συνέχεια χρησιμοποιήστε το
chmod
εντολή για να γίνει εκτελέσιμο.
chmod +x files.sh
Έχουμε μερικά αρχεία σε αυτόν τον κατάλογο. Το ένα έχει ένα απλό όνομα αρχείου και τα άλλα δύο χρησιμοποιούν κάτω παύλες “
_
“ή παύλες”
-
” αντί για κενά. Αυτό βλέπουμε όταν εκτελούμε το σενάριο.
./files.sh
Αυτό φαίνεται να λειτουργεί καλά. Αλλά ας αλλάξουμε τα αρχεία στον κατάλογο για αρχεία που περιέχουν κενά στα ονόματά τους.
./files.sh
Κάθε λέξη σε κάθε όνομα αρχείου αντιμετωπίζεται σαν να ήταν ένα όνομα αρχείου από μόνη της, και έτσι το σενάριο αποτυγχάνει. Αλλά το μόνο που χρειάζεται να κάνουμε για να κάνουμε το σενάριο να χειρίζεται κενά στα ονόματα αρχείων είναι να παραθέσουμε το
$file
μεταβλητή μέσα στο
for
βρόχος.
#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done
Σημειώστε ότι το σύμβολο του δολαρίου “
$
” βρίσκεται μέσα στα εισαγωγικά. Κάναμε αυτήν την αλλαγή και την αποθηκεύσαμε στο αρχείο δέσμης ενεργειών “files.sh”. Αυτή τη φορά, ο χειρισμός των ονομάτων αρχείων γίνεται σωστά.
./files.sh
Σε απόσταση, αλλά όχι ξεφλουδισμένο
Η αποφυγή διαστημάτων στα δικά σας ονόματα αρχείων θα σας οδηγήσει μόνο μέχρι τώρα. Είναι αναπόφευκτο να συναντήσετε αρχεία από άλλες πηγές με ονόματα που περιέχουν κενά. Ευτυχώς, εάν χρειάζεται να χειριστείτε αυτά τα αρχεία στη γραμμή εντολών ή σε σενάρια, υπάρχουν εύκολοι τρόποι να το κάνετε.
VIA:
HowToGeek.com
