2014-05-02 2 views
7

Ich muss die erste Datei in einem Ordner mit der Erweiterung .tar.gz erhalten. Ich kam mit:Erste Datei der angegebenen Erweiterung aus einem Ordner

FILE=/path/to/folder/$(ls /path/to/folder | grep ".tar.gz$" | head -1) 

aber ich fühle, dass es einfacher und eleganter getan werden kann. Gibt es eine bessere Lösung?

+1

Wie definieren Sie "zuerst"? Alphabetisch sortieren, sortieren? – indivisible

+0

Theoretisch die erste in alphabetisch aufsteigender Reihenfolge, praktisch würde es eine einzige Datei dieser Erweiterung geben ... – linkyndy

Antwort

11

Sie können alle Dateien in einem Array erhalten, und erhalten dann die gewünschte:

files=(/path/to/folder/*.tar.gz) 

die erste Datei bekommen:

echo "${files[0]}" 

die letzte Datei bekommen:

echo "${files[${#files[@]}-1]}" 

Sie könnten die Shell-Option nullglob für die Behandlung von Fällen einstellen, in denen keine Matc vorhanden ist Hing Dateien:

shopt -s nullglob 
+0

Es scheint ein bisschen übertrieben, meine Variante hat weniger Zeilen, obwohl es einige redundante Code hat ... – linkyndy

+0

@AndreiHorak Do not ready verstehe die Frage. Wenn Sie den Pfad und die Dateierweiterung kennen, gibt es zahlreiche Möglichkeiten, die besser sind als _parsing 'ls'_. Zum Beispiel, echo /path/*.tar.gz | cut -d '' -f1 'unter der Annahme, dass die Dateinamen keine Leerzeichen enthalten. – devnull

+2

2 Bemerkungen: 1. um das letzte Element des Arrays 'files' zu echo, funktioniert auch der Befehl' echo "$ {files [-1]}" '. 2. Wenn keine Dateien (und 'nullglob') vorhanden sind, erhalten Sie eine Fehlermeldung _bad array subscript_.In diesem Fall möchten Sie vielleicht mit '(($ {# files [@]})) && echo" $ {files [-1]} "' ersetzen. –

1

hier ist die kürzere Version von Ihrer eigenen Idee.

FILE=$(ls /path/to/folder/*.tar.gz| head -1) 
3

Sie können set wie unten gezeigt verwenden. Die Schale wird das Wildcard erweitern und set werden die Dateien zuordnen als Positionsparameter, die $1 mit zugegriffen werden kann, $2 usw.

# set nullglob so that if no matching files are found, the wildcard expands to a null string 
shopt -s nullglob 

set -- /path/to/folder/*.tar.gz 

# print the name of the first file 
echo "$1" 

Es ist keine gute Praxis zu parse ls wie Sie tun, weil es nicht Dateinamen umgehen Zeilenumbrüche enthalten. Auch die grep ist unnötig, weil Sie einfach ls /path/to/folder/*.tar.gz | head -1 tun können.

2

Hier ist ein Weg, um es zu erreichen:

for FILE in *.tar.gz; do break; done 

Sie sagen bash-break die Schleife in der ersten Iteration, wenn nur der erste Dateinamen FILE zugeordnet ist.


Eine andere Möglichkeit, das gleiche zu tun:

first() { FILE=$1; } && first *.tar.gz 

Hier werden Sie mit Hilfe der Positionsparameter der Funktion first, die die Positionsparameter des gesamten bash Prozess ist besser als set (wie bei set --) .

Verwandte Themen