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

Θέλω να λάβω το όνομα αρχείου (χωρίς επέκταση) και την επέκταση ξεχωριστά.

Η καλύτερη λύση που βρήκα μέχρι στιγμής είναι η εξής:

NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`

Αυτό είναι λάθος γιατί δεν λειτουργεί αν το όνομα του αρχείου περιέχει πολλούς χαρακτήρες .. Αν, ας πούμε, έχω a.b.js, θα θεωρήσει a και b.js, αντί για a.b και js.

Αυτό μπορεί να γίνει εύκολα στην Python με την εντολή

file, ext = os.path.splitext(path)

αλλά θα προτιμούσα να μην ανοίξω έναν διερμηνέα Python μόνο γι' αυτό, αν είναι δυνατόν.

Καμία καλύτερη ιδέα;

Λύση

Πρώτον, πάρτε το όνομα του αρχείου χωρίς τη διαδρομή:

filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"

Εναλλακτικά, μπορείτε να εστιάσετε στο τελευταίο '/' της διαδρομής αντί για το '.' το οποίο θα πρέπει να λειτουργήσει ακόμη και αν έχετε απρόβλεπτες επεκτάσεις αρχείων:

filename="${fullfile##*/}"

Ίσως να θέλετε να ελέγξετε την τεκμηρίωση :

  • Στο διαδίκτυο στην ενότητα "3.5.3 Shell Parameter Expansion&quot,
  • Στη σελίδα bash manpage στην ενότητα με τίτλο "Parameter Expansion&quot,
Σχόλια (20)
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz

Για περισσότερες λεπτομέρειες, ανατρέξτε στο shell parameter expansion στο εγχειρίδιο Bash.

Σχόλια (16)
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js

δουλεύει μια χαρά, οπότε μπορείτε απλά να χρησιμοποιήσετε:

pax> FILE=a.b.js
pax> NAME=$(echo "$FILE" | sed 's/\.[^.]*$//')
pax> EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
pax> echo $NAME
a.b
pax> echo $EXTENSION
js

Οι εντολές, παρεμπιπτόντως, λειτουργούν ως εξής.

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

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

Σχόλια (1)