ubuntuusers.de

Verzeichnisinhalt indexieren

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

skewjack

Anmeldungsdatum:
17. Dezember 2011

Beiträge: Zähle...

Danke fürs Reinschauen, hier gibts was zum Tüfteln.

Ich habe ein Bash Skript, mit welchem ich unter anderem auch den Inhalt eines bestimmten Verzeichnisses ~/foo/ anzeigen lasse. Alle Dateienamen bestehen aus einem einheitlichen Datumsformat (YYYY-MM-DD). Ich möchte nun diese Einträge für mein Skript so indizieren, dass ich sie über deren Index direkt aufrufen kann. Ein kurzer Auszug aus dem Skript:

1
2
3
4
5
6
ls -1 ~/foo
echo "Open which entry?"
read DATA
if [ -f ~/foo/${DATA} ] ; then
   vim -p ~/foo/${DATA}
fi

Dieser Teil wird ausgeführt, wenn ich nicht direkt eine der Dateien im Ordner ~/foo/ als Argument angebe. Derzeit kann ich hier den Dateinamen (z.B. 2012-01-09) angeben. Allerdings hätte ich gerne, dass ich als Ausgabe in etwa folgendes erhalte (unter der Annahme, es existieren auch folgende 3 Dateien in dem Ordner):

001: 2012-01-05
002: 2012-01-08
003: 2012-01-09
Open which entry?

Daraus resultierend würde ich diese auch gerne über diesen Index (z.B. 001) ansprechen können, anstatt den Dateinamen bei "read DATA" angeben zu müssen. Eingabe vorher:

Open which entry?
2012-01-09

Gewünschte Eingabe:

Open which entry?
003

Wie kann man das am besten verwirklichen? Glücklicherweise werden alle Dateien in diesem Ordner dieses Namensformat tragen und somit auch stets chronologisch richtig gelistet werden. Ich bräuchte vor allem Unterstützung bei der Stelle, dass für jeden einzelnen Eintrag ein neuer Index erzeugt wird und auch, dass dieser wieder mit der entsprechenden Datei in Verbindung gebracht werden kann. Ein schöner Schmankerl, aber nicht unbedingt notwendig, wäre, wenn ich bei dieser Eingabe auch mehrere Einträge auswählen kann, indem ich z.B. (001 003) zu besagter Stelle eingebe.

Vielen Dank an alle, die sich das durchlesen und vielleicht so manchen Kommentar dazu hinterlassen. Mit Grüßen!

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Hallo,

Ich würde dazu Arrays verwenden. Dann hat man eben 0, 1, 2, … 10, 11, … als Indexe und nicht 001, 002, …, aber daran kann man ja auch noch rumbasteln, wenn man will.

Ansonsten nen kleiner Schönheitstipp: Schreib nicht vim in solche Skripte, sondern $EDITOR. Viele Leute (du hoffentlich auch) haben sowas wie

1
export EDITOR=vim

in der ~/.bashrc stehen. Dann funktioniert das Skript auch für andere Leute und falls du irgendwann mal den Editor wechseln solltest, funktionieren deine alten Skripte noch.

Grüße, Keba.

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

skewjack schrieb:

Danke fürs Reinschauen, hier gibts was zum Tüfteln.

Ich habe ein Bash Skript, mit welchem ich unter anderem auch den Inhalt eines bestimmten Verzeichnisses ~/foo/ anzeigen lasse. Alle Dateienamen bestehen aus einem einheitlichen Datumsformat (YYYY-MM-DD). Ich möchte nun diese Einträge für mein Skript so indizieren, dass ich sie über deren Index direkt aufrufen kann. Ein kurzer Auszug aus dem Skript:

1
2
3
4
5
6
ls -1 ~/foo
echo "Open which entry?"
read DATA
if [ -f ~/foo/${DATA} ] ; then
   vim -p ~/foo/${DATA}
fi

Dieser Teil wird ausgeführt, wenn ich nicht direkt eine der Dateien im Ordner ~/foo/ als Argument angebe. Derzeit kann ich hier den Dateinamen (z.B. 2012-01-09) angeben. Allerdings hätte ich gerne, dass ich als Ausgabe in etwa folgendes erhalte (unter der Annahme, es existieren auch folgende 3 Dateien in dem Ordner):

001: 2012-01-05
002: 2012-01-08
003: 2012-01-09
Open which entry?

Daraus resultierend würde ich diese auch gerne über diesen Index (z.B. 001) ansprechen können, anstatt den Dateinamen bei "read DATA" angeben zu müssen. Eingabe vorher:

Open which entry?
2012-01-09

Gewünschte Eingabe:

Open which entry?
003

Wie kann man das am besten verwirklichen? Glücklicherweise werden alle Dateien in diesem Ordner dieses Namensformat tragen und somit auch stets chronologisch richtig gelistet werden. Ich bräuchte vor allem Unterstützung bei der Stelle, dass für jeden einzelnen Eintrag ein neuer Index erzeugt wird und auch, dass dieser wieder mit der entsprechenden Datei in Verbindung gebracht werden kann. Ein schöner Schmankerl, aber nicht unbedingt notwendig, wäre, wenn ich bei dieser Eingabe auch mehrere Einträge auswählen kann, indem ich z.B. (001 003) zu besagter Stelle eingebe.

Am einfachsten per select mit angepasstem PS3 damit du "deinen" Prompt von oben siehst.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
PS3="
Open which entry?
> "
select FILE in  $(cd ~/foo/; echo *); do 
    if [ -n "$FILE" ]; then
       # machwas mit $FILE, z.B.
       echo FILE selected was: $FILE
       break   # weglassen, dann fragt select nach dem nächsten File bis du Ctrl-D drückst.
    fi
done

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

radoe2 schrieb:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
PS3="
Open which entry?
> "
select FILE in  $(cd ~/foo/; echo *); do 
    if [ -n "$FILE" ]; then
       # machwas mit $FILE, z.B.
       echo FILE selected was: $FILE
       break   # weglassen, dann fragt select nach dem nächsten File bis du Ctrl-D drückst.
    fi
done

Funktioniert mit den Dateien der Anforderung, da diese kein Blank enthalten, aber nicht, wenn sie das nicht tun.

So dagegen:

1
2
3
4
5
6
7
cd ~/foo/
select FILE in *; do 
    if [ -n "$FILE" ]; then
       echo FILE selected was: $FILE
       break
    fi
done

klappt es auch mit Leerzeichen in Dateinamen, mit

1
select FILE in * .*; do 

auch mit versteckten Dateien.

(Und bitte nicht solche Vollzitate)

skewjack

(Themenstarter)

Anmeldungsdatum:
17. Dezember 2011

Beiträge: 8

Vielen Dank, der Part mit select ist da genau das richtige. Allerdings möchte ich wieder in das alte Verzeichnis zurückkehren, weshalb ich später

1
cd -

verwendet habe. Doch dann bekomme ich das Verzeichnis ausgegeben. Wie kann ich diese Ausgabe von cd unterbinden?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Das cd- Gemurkse würde ich überhaupt erst gar nicht machen:

select FILE in ~/foo/* ; do 
    if [ -n "$FILE" ]; then
       echo FILE selected was: $FILE
       break
    fi
done

Es ist ohnehin sauberer, wenn Du unnötige Verzeichniswechsel weglässt.

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Das macht aber lange Dateinamen.

1
cd - > /dev/null

Eine Umleitung nach Nirgendwo der Ausgabe löst das Problem elegant.

skewjack

(Themenstarter)

Anmeldungsdatum:
17. Dezember 2011

Beiträge: 8

Es funktioniert tadellos, vielen Dank euch allen.

Antworten |