Θέλω να λάβω το όνομα αρχείου (χωρίς επέκταση) και την επέκταση ξεχωριστά.
Η καλύτερη λύση που βρήκα μέχρι στιγμής είναι η εξής:
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##*/}"
Ίσως να θέλετε να ελέγξετε την τεκμηρίωση :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Για περισσότερες λεπτομέρειες, ανατρέξτε στο shell parameter expansion στο εγχειρίδιο Bash.
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
αντικαθιστά έναν οποιοδήποτε αριθμό χαρακτήρων που ακολουθείται από έναν χαρακτήρα "."
στην αρχή της γραμμής, με τίποτα (δηλαδή, αφαιρεί τα πάντα από την αρχή της γραμμής μέχρι την τελική τελεία, συμπεριλαμβανομένης). Πρόκειται για μια άπληστη αντικατάσταση, η οποία είναι η προεπιλεγμένη ενέργεια.