2017-01-15 2 views
0

Ich habe mehrere Dateien in einem Ordner und ihre Dateinamen enthält alphanumerische Werte. Für z.B. 045_gfds.sql, 46kkkk.sql, 47asdf.sql usw. Ich möchte Nummern in diesen Dateinamen mit einer anderen Zahl vergleichen, die in der Variable $ x = 45 gespeichert ist und finde Dateien heraus, deren Dateinummer größer als die Zahl ist. Ich benutze Cygwin und kann derzeit nur Nummern mit dem Befehl egrep abrufen. für z.B.Wie vergleicht man die Nummer mit Dateinamen in BASH

filename="C:\scripts" 
dir $filename | egrep -o [0-9]+ 

Ausgang ist: 045 46 47

I-Ausgang als Dateiname soll nach einem Vergleich von mehr als $ = 45 mit allen Dateinamen wie:

46kkkk.sql 
47asdf.sql 

mit regulären Ausdrücken mehr Hilfe nötig für den Vergleich als Werte in Dateiname.

+1

Dies ist eine Frage für die [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/). Aber vielleicht nicht. Ich rate Ihnen, zu erklären, was Sie erreichen wollen, nicht, wie ** Sie versuchen, zu erreichen. Es gibt wahrscheinlich eine bessere Lösung. Lesen Sie hier: [Die XY-Frage] (http://xyproblem.info/). – giusti

+0

Danke giusti, ich möchte als Dateinamen ausgeben, die Nummer im Dateinamen größer als $ x = 45 enthält. Bitte lassen Sie mich wissen, wenn mehr Informationen benötigt werden, um meine Frage zu klären –

Antwort

0
#!/bin/bash 

dir="$1" 

print_if_greater="45" 

for fname in "$dir"/[0-9]*; do 
    num="${fname##*/}"  # isolate filename from path 
    num="${num%%[^0-9]*}" # extract leading digits from filename 

    if ((num > print_if_greater)); then 
     printf '%s\n' "$fname" 
    fi 
done 

Das obige Skript durchläuft alle Dateien im angegebenen Verzeichnis, die mit mindestens einer Ziffer beginnen.

Der Dateiname wird aus dem Pfad entfernt und die Anfangsziffern im Dateinamen werden mithilfe der Variablenerweiterungssyntax bash extrahiert.

Wenn die extrahierte Zahl größer als $print_if_greater ist, wird der vollständige Pfadname auf der Standardausgabe angezeigt.

Dieses Skript mit dem Verzeichnis aufgerufen wird, die Sie mögen, untersuchen:

$ ./thescript.sh 'C:\scripts' 

oder

$ bash ./thescript.sh 'C:\scripts' 

ich keinen Zugriff auf Cygwin erhalten habe, so dass ich nicht in der Lage gewesen, um es mit Windows-gestylten Pfaden zu testen. Wenn das Obige nicht funktioniert, versuchen Sie es mit C:/scripts als Pfad.

+0

Danke Kusalananda !!! Es funktioniert absolut gut. Das einzige Problem, mit dem ich jetzt konfrontiert bin, ist, dass es nicht den Dateinamen berücksichtigt, der das hat. (Punkt) nach der Nummer. für z.B. Dateiname wie '69 .hghgg.sql 'wird im Ergebnis nach dem Vergleich nicht angezeigt. –

+0

@JayeshSangle Hmmm ... tut es für mich. Ich habe Cygwin installiert und getestet. Hat die Datei am Anfang des Dateinamens Platz? – Kusalananda

0

Sie können dies versuchen:

DIR="C:\scripts" 
MAX=45 
for FILE in "$DIR"/* 
do 
    if 
    [[ "$FILE" =~ ^([0-9]+) ]] 
    then 
    NUMBER="${BASH_REMATCH[1]}" 
    if 
     [ "$NUMBER" -gt "$MAX" ] 
    then 
     echo "$FILE" 
    fi 
    fi 
done 

Bitte beachten Sie, ich den Code nicht getestet haben. Es ist bash-spezifisch und nimmt an, dass die Zahlen immer am Anfang des Dateinamens stehen.

Verwandte Themen