2016-12-01 1 views
0

So habe ich einen Ordner mit einem Haufen von Dateien. Datei, Datei.0, Datei.1, Datei.2Finden Sie den größten Index in der Erweiterung der Datei in einem Bash-Skript

Ich versuche, die größte index in Erweiterung dieser Dateien zu finden. Also muss es 2 sein.

Ich habe diesen Befehl geschrieben, der alle Dateien mit numeric extension zählt. Aber es funktioniert nicht richtig, wenn der Index größer als 10 ist. Es funktioniert überhaupt nicht, weil Ich möchte nur den größten Index, nicht die Summe der Datei mit der Nummer im Index finden.

$1 (is file name in this case File) 

y=$(echo $(ls -d $1.[0-inf] | wc -l)) 

Wie kann ich das tun?

+0

Was passiert, wenn Ihr Argument '$ 1 'ist' File.1'? Möchten Sie nach Dateien mit den Namen 'Files.1.0',' Files.1.1', 'Files.1.2' und so weiter suchen? – Aserre

+0

Ja. Index bedeutet Wert nach dem letzten Punkt. – davoid

Antwort

2

Erster Tipp: do not parse the output of ls. Besonders in deinem Fall.

Sie können das folgende Skript in reiner bash benutzen, um Ihr Problem zu beheben:

#!/bin/bash 

# needed for correct glob expansion 
shopt -s nullglob 

# we check every file following the format $1.extension 
max_index=0 
for f in $1.* 
do 
    # we retrieve the last extension 
    ext=${f##*.} 
    re="^[0-9]+$" 

    # if ext is a number and greater than our max, we store it 
    if [[ $ext =~ $re && $ext -gt $max_index ]] 
    then 
     max_index=$ext 
    fi 
done 
echo $max_index 
+0

Was ist damit? 'y = $ (echo $ (ls -d $ 1. * [0-9] * | sed 's/[^ 0-9] * // g')) max = 0 für v in $ y; do wenn [$ v -gt $ max]; dann max = $ v fi done' – davoid

+0

@davoid, wenn die Datei nicht vorhanden ist: 'ls: kann nicht auf 'nothing. * [0-9] *' zugreifen: Keine solche Datei oder dieses Verzeichnis'. Aus diesem Grund verwenden Sie in diesen Fällen nicht 'ls'. – Aserre

+0

Ok. Danke für diese Information. Aber ich vermute, dass die Datei existiert. – davoid

1

Sie können dies versuchen:

for i in file\.*; do echo ${i##*.}; done | sort -g | tail -n1 

${i##*.} wird vor dem letzten . im Dateinamen alles zu entfernen.

sort -g wird als numerischer Wert sortiert.

tail -n1 druckt den letzten Index.

Ein fehleranfälliger Weise ist find Befehl als zu verwenden, um es mit der Datei fertig zu werden, das Muster, die Dateinamen mit Leerzeichen nicht passenden ...

find -type f -name "file\.*" -exec bash -c 'echo ${1/*\.}' _ "{}" \; 2>/dev/null | sort -n | tail -n1 

bash -c 'echo ${1/*\.}' _ "{}" der Befehl ist, der die Zeichen vor dem Streifen ..

Sie können am Anfang des Befehls -maxdepth 1 hinzufügen, um ein rekursives Durchsuchen von Verzeichnissen zu vermeiden.

+0

Wenn keine Dateien dem Benennungsmuster folgen, gibt das Skript eine Liste aller Dateien des aktuellen Verzeichnisses zurück. – Aserre

Verwandte Themen