Πώς να διαχωρίσετε το όνομα αρχείου και την επέκταση στο Bash

Πώς να διαχωρίσετε το όνομα αρχείου και την επέκταση στο Bash
Πώς να διαχωρίσετε το όνομα αρχείου και την επέκταση στο Bash

Εισαγωγή:

Όταν εργάζεστε με αρχεία στο Bash, μπορεί συχνά να χρειαστεί να διαχωρίσετε το όνομα αρχείου από την επέκτασή του. Μια κοινή προσέγγιση χρησιμοποιεί την εντολή «cut», αλλά αυτή η μέθοδος μπορεί να αποτύχει με ονόματα αρχείων που περιέχουν πολλές τελείες.

Για παράδειγμα, ένα όνομα αρχείου όπως το "a.b.js" θα χωριστεί εσφαλμένα σε "a" και "b.js" αντί για "a.b" και "js". Αν και η Python παρέχει μια εύκολη λύση με το `os.path.splitext()`, η χρήση της Python μπορεί να μην είναι πάντα η πιο αποτελεσματική επιλογή. Αυτό το άρθρο διερευνά καλύτερες μεθόδους για την επίτευξη αυτής της εργασίας στο Bash.

Εντολή Περιγραφή
${variable%.*} Επέκταση παραμέτρου για την κατάργηση της επέκτασης από ένα όνομα αρχείου.
${variable##*.} Επέκταση παραμέτρου για εξαγωγή της επέκτασης από ένα όνομα αρχείου.
awk -F. Ορίζει το διαχωριστικό πεδίου σε μια τελεία, που χρησιμοποιείται για τον διαχωρισμό του ονόματος αρχείου.
OFS="." Διαχωριστής πεδίων εξόδου σε awk, που χρησιμοποιείται για την ανακατασκευή του ονόματος αρχείου χωρίς επέκταση.
NF-- Μειώνει τον αριθμό των πεδίων κατά ένα σε awk, καταργώντας ουσιαστικά την επέκταση.
${BASH_REMATCH} Πίνακας που συγκρατεί τις αντιστοιχίσεις από μια κανονική έκφραση στο Bash.
local variable Δηλώνει μια μεταβλητή με τοπικό εύρος εντός μιας συνάρτησης στο Bash.

Λεπτομερής ανάλυση των λύσεων Bash

Τα σενάρια που παρέχονται προσφέρουν διάφορες μεθόδους για τον διαχωρισμό ενός ονόματος αρχείου και της επέκτασής του στο Bash. Το πρώτο σενάριο χρησιμοποιεί επέκταση παραμέτρου Bash. Η μεταβλητή ${FILE%.*} αφαιρεί την επέκταση αφαιρώντας τα πάντα από την τελευταία περίοδο μέχρι το τέλος της χορδής, ενώ ${FILE##*.} αποτυπώνει την επέκταση παίρνοντας τα πάντα μετά την τελευταία περίοδο. Αυτή η μέθοδος είναι απλή και αποτελεσματική για τις περισσότερες δομές ονομάτων αρχείων. Το δεύτερο σενάριο χρησιμοποιεί awk, ένα ισχυρό εργαλείο επεξεργασίας κειμένου σε περιβάλλοντα τύπου Unix. Ρυθμίζοντας το διαχωριστικό πεδίου σε τελεία χρησιμοποιώντας -F., επιτρέπει τον διαχωρισμό του ονόματος αρχείου σε μέρη. Ο διαχωριστής πεδίου εξόδου, OFS="."και μειώνοντας τον αριθμό των πεδίων με NF-- είναι τεχνικές επανασυναρμολόγησης του ονόματος αρχείου χωρίς την επέκτασή του.

Το τρίτο σενάριο χρησιμοποιεί κανονικές εκφράσεις στο Bash, αξιοποιώντας ${BASH_REMATCH} για να καταγράψετε ομάδες σε έναν αγώνα regex. Αυτό το σενάριο χρησιμοποιεί ένα μοτίβο που χωρίζει το όνομα αρχείου σε δύο ομάδες: μία για το όνομα βάσης και μία για την επέκταση. Τέλος, η προσαρμοσμένη δέσμη ενεργειών συνάρτησης ενσωματώνει τη λογική επέκτασης παραμέτρου μέσα σε μια συνάρτηση, βελτιώνοντας την επαναχρησιμοποίηση και την αναγνωσιμότητα του κώδικα. Χρησιμοποιεί local variable δηλώσεις για τη διατήρηση του εύρους των μεταβλητών εντός της συνάρτησης, αποτρέποντας ανεπιθύμητες παρενέργειες σε μεγαλύτερα σενάρια. Κάθε μέθοδος δείχνει μια διαφορετική προσέγγιση για την επίλυση του ίδιου προβλήματος, επιδεικνύοντας την ευελιξία και τη δύναμη του σεναρίου Bash.

Χρήση της επέκτασης παραμέτρων στο Bash

Σενάριο Bash

#!/bin/bash
# Script to extract filename and extension using parameter expansion
FILE="a.b.js"
FILENAME="${FILE%.*}"
EXTENSION="${FILE##*.}"
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Χρήση του Awk για διαχωρισμό ονόματος αρχείου και επέκτασης

Bash με Awk

#!/bin/bash
# Script to extract filename and extension using awk
FILE="a.b.js"
FILENAME=$(echo "$FILE" | awk -F. '{OFS="."; NF--; print $0}')
EXTENSION=$(echo "$FILE" | awk -F. '{print $NF}')
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Χρήση κανονικών εκφράσεων στο Bash

Bash scripting με regex

#!/bin/bash
# Script to extract filename and extension using regex
FILE="a.b.js"
[[ "$FILE" =~ (.*)\.(.*) ]]
FILENAME=${BASH_REMATCH[1]}
EXTENSION=${BASH_REMATCH[2]}
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Χρήση προσαρμοσμένης συνάρτησης στο Bash

Bash scripting με προσαρμοσμένη λειτουργία

#!/bin/bash
# Function to extract filename and extension
extract_filename_extension() {
  local file="$1"
  echo "Filename: ${file%.*}"
  echo "Extension: ${file##*.}"
}
# Call the function with a file
extract_filename_extension "a.b.js"

Εξερεύνηση εναλλακτικών μεθόδων για χειρισμό αρχείων στο Bash

Πέρα από τις μεθόδους που έχουν ήδη συζητηθεί, υπάρχουν άλλες χρήσιμες τεχνικές στο Bash για τον χειρισμό ονομάτων αρχείων και επεκτάσεων. Μια τέτοια μέθοδος περιλαμβάνει τη χρήση του basename και dirname εντολές. basename μπορεί να χρησιμοποιηθεί για την εξαγωγή του ονόματος αρχείου από μια διαδρομή, ενώ dirname ανακτά τη διαδρομή καταλόγου. Ο συνδυασμός αυτών των εντολών με την επέκταση παραμέτρων μπορεί να διαχωρίσει αποτελεσματικά ονόματα αρχείων και επεκτάσεις. Για παράδειγμα, χρησιμοποιώντας basename "$FILE" ".${FILE##*.}" αφαιρεί την επέκταση από το όνομα αρχείου. Αυτή η προσέγγιση είναι ιδιαίτερα χρήσιμη όταν εργάζεστε με πλήρεις διαδρομές αρχείων και όχι μόνο με ονόματα αρχείων.

Μια άλλη μέθοδος περιλαμβάνει τη χρήση sed, ένα ισχυρό πρόγραμμα επεξεργασίας ροής για φιλτράρισμα και μετασχηματισμό κειμένου. Δημιουργώντας κατάλληλες κανονικές εκφράσεις, sed μπορεί να απομονώσει το όνομα του αρχείου και την επέκταση. Για παράδειγμα, η εντολή echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' χωρίζει το όνομα του αρχείου και την επέκταση, τοποθετώντας τα σε ξεχωριστές ομάδες λήψης. Αυτή η τεχνική είναι ευέλικτη και μπορεί να χειριστεί πολύπλοκες δομές ονομάτων αρχείων. Η εξερεύνηση αυτών των πρόσθετων εργαλείων και μεθόδων επεκτείνει την ικανότητά σας να χειρίζεστε δεδομένα αρχείων στο Bash, παρέχοντας ισχυρές λύσεις για διάφορα σενάρια δέσμης ενεργειών.

Συχνές ερωτήσεις σχετικά με τη χειραγώγηση αρχείων Bash

  1. Ποιος είναι ο σκοπός του ${FILE%.*} εντολή;
  2. Καταργεί την επέκταση από το όνομα αρχείου αφαιρώντας τα πάντα μετά την τελευταία περίοδο.
  3. Πώς το ${FILE##*.} εργασία εντολής;
  4. Εξάγει την επέκταση παίρνοντας τα πάντα μετά την τελευταία περίοδο στο όνομα αρχείου.
  5. Τι κάνει awk -F. κάνω στο παρεχόμενο σενάριο;
  6. Ορίζει το διαχωριστικό πεδίου σε μια τελεία, επιτρέποντας στο όνομα του αρχείου να χωριστεί σε μέρη.
  7. Γιατί να χρησιμοποιήσετε NF-- σε μια awk γραφή;
  8. Μειώνει τον αριθμό των πεδίων κατά ένα, αφαιρώντας ουσιαστικά την επέκταση από το όνομα του αρχείου.
  9. Πώς βοηθούν οι τυπικές εκφράσεις στην εξαγωγή ονόματος αρχείου και επέκτασης;
  10. Επιτρέπουν την αντιστοίχιση και την ομαδοποίηση προτύπων, η οποία μπορεί να απομονώσει διαφορετικά μέρη του ονόματος αρχείου.
  11. Ποιο είναι το όφελος από τη χρήση μιας προσαρμοσμένης συνάρτησης στο Bash;
  12. Μια προσαρμοσμένη λειτουργία ενισχύει την επαναχρησιμοποίηση και την αναγνωσιμότητα του κώδικα, κάνοντας τα σενάρια πιο αρθρωτά.
  13. Πώς κάνει basename βοήθεια με ονόματα αρχείων;
  14. Εξάγει το όνομα αρχείου από μια πλήρη διαδρομή αρχείου, προαιρετικά αφαιρώντας την επέκταση.
  15. Μπορώ sed να χρησιμοποιηθεί για χειρισμό ονόματος αρχείου;
  16. Ναί, sed μπορεί να χρησιμοποιήσει κανονικές εκφράσεις για να μετασχηματίσει και να απομονώσει μέρη ονομάτων αρχείων.

Συμπλήρωση των λύσεων για την εξαγωγή ονόματος αρχείου και επέκτασης

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