2016-11-21 4 views
0

Der Name des Verzeichnisses ist bekannt, und es ist bekannt, dass alle Dateien in diesem Verzeichnis die gleiche Erweiterung haben. Ich muss nur eine Erweiterung extrahieren und sie einer Variablen zuweisen.Wie extrahiere ich die Erweiterung einer Datei in einem Verzeichnis?

Ich habe ein Skript, das verschiedene Routinen abhängig vom Inhalt eines Verzeichnisses nimmt. Wenn der Ordner beispielsweise jpg Dateien enthält, führt das Skript verschiedene Aktionen für tiff Dateien aus. Mein Skript muss nicht die Namen der Dateien oder die Nummern, nur ihre Erweiterungen kennen. Also muss ich eine Erweiterung einer beliebigen Datei extrahieren (alle Dateien haben die gleiche Erweiterung) und sie einer Variablen zuweisen.

Ich habe versucht, so etwas zu tun:

variable=$(basename "/path/dir/*") 
extension="${variable##*.}" 

wo "*" Wildcard alle Dateien auflistet. Ich brauche nur eine Erweiterung.

+0

Was meinst du mit der Erweiterung einer unbekannten Datei? Es gibt den Befehl 'file', der den Typ der Datei angibt. Fragen Sie nach einem Bash-Skript, das nur die Erweiterung eines bestimmten Dateinamens extrahiert? – varlogtim

+0

Verzeichnis ist bekannt, Dateiname ist unbekannt und muss nicht den Namen oder wie viele es gibt. In meinem Skript ist nur eine Dateierweiterung erforderlich. – siamak

+2

Können Sie ein Beispiel für den Verzeichnisinhalt und was Sie benötigen im Skript zur Verfügung stellen? – varlogtim

Antwort

0
extension=$(ls directory_path/ | awk -F. 'NR==1{print $NF}') 
0

Sie können awk verwenden, um die Erweiterung zu finden.

for file in directory/*.*; do 
    var=$(echo $file | awk 'BEGIN{FS="."} {print $NF}') 
    break 
done 

In diesem Beispiel weist FS awk an, den Punkt "." um Felder zu trennen, und $ NF gibt das letzte Feld an.

+0

Danke. Leider gibt es mir einen Syntaxfehler "Syntaxfehler nahe dem unerwarteten Token' do '". – siamak

+0

Seltsam. Sie könnten "do" in die eigene Zeile verschieben und das Semikolon vom Ende der ersten Zeile entfernen, um zu sehen, ob sich irgendetwas ändert. Beachten Sie auch, dass ich das Beispiel bearbeiten musste, weil ich das letzte Anführungszeichen in Zeile zwei vergessen hatte. Stellen Sie also sicher, dass Sie die aktualisierte Version ausprobiert haben. Wenn nichts anderes funktioniert, versuchen Sie, den genauen Befehl, den Sie gerade ausführen, zu veröffentlichen (Verzeichnistext und alle). – Guest

+0

Danke, dass es funktioniert hat. Ich denke, es fehlte "'" nach {print $ NF}. – siamak

0
file=$(find directory -maxdepth 1 -mindepth 1 -type f -print -quit) 
ext="${file##*.}" 

Der find Befehl findet die erste Datei in directory, den Pfad druckt und beendet. Das Ergebnis (Pfad) wird in die Variable file geschrieben.

Die nächste Zeile entfernt die längste Übereinstimmung von *. vom Anfang des Pfads und weist das Ergebnis der Variablen ext zu.

Passen Sie die Optionen -maxdepth und -mindepth entsprechend an.

Verwandte Themen