Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SH] Prüfen ob Pfad innerhald von Pfad ist



fsd
10-10-2004, 17:11
Hi,

Gibt es eine Möglichkeit in bash/sh zu prüfen ob sich eine Datei unterhald eines Pfades befindet? Das entscheidende Kriterium ist: Die Datei existiert noch nicht. Also fallen find, usw weg.
Ich werde es an einem Beispiel erläutern:



pfad_1="/home/user/test/dir/file"
pfad_3="/home/user/test"
# jetzt soll getestet werden, ob sich die Datei, die mit pfad_1
# angegeben wurde unterhalb von dem Pfad, der in pfad_2 angegeben
# befindet. (Dies ist hier der Fall. Wie teste ich das).
# Schwierigkeit: Die Datei mit pfad_1 angegeben existiert noch _nicht_
# Schwierigkeit 2: Es können auch ".." in den Pfadangaben sein.


Der Sinn dieser ganzen Sache ist folgendermaßen.
Ich habe ein script geschrieben, welches nun eine Datei kopieren soll. Der benutzer gibt pfad_1 an. Nun soll getestet werden, ob der Pfad in unterhalb eines gegebenen Verzeichnisses befindet. Das script soll nämlich nur in dieses Verzeichnis schreiben. Wenn dies nicht der Fall ist, soll es eine Fehlermeldung ausgeben.


danke.

MFG fsd.

peschmae
10-10-2004, 18:29
Eine Möglichkeit wäre z.B. die pfad_1 - Datei mit "touch" zu behandeln.

Schwierigkeit 2 wäre dann ganz einfach mit
ls -d -L $pfad_1
zu umgehen. Anschliessend reicht was in der Art von


if echo $(ls -d -L $pfad_1) | grep -q "^$pfad_2"; then
fi


Touch sollte ja auch eventuell schon exisitierenden Dateien nicht schaden.

MfG Peschmä

fsd
10-10-2004, 18:39
Danke, das werde ich mir durch den Kopf gehen lassen.
Es darf natürlich keinesfalls etwas beim Testen verändert werden. Ein touch wäre evtl akzeptabel.

MFG fsd.

fork
10-10-2004, 19:51
echo /home/user/test/dir/file | grep -q "^/homer/user/test" && echo "ist drin" || echo "ist nicht drin"
So vielleicht?

Zur Erklärung:
- Schreibe langen Pfad nach stdout
- untersuche(grep) stdin ob /home/user/test am Anfang des Strings steht und
- abhaengig vom Ergebnis zeige den entsprechenden Text an

peschmae
10-10-2004, 20:24
und was wird aus dem da?
# Schwierigkeit 2: Es können auch ".." in den Pfadangaben sein.

MfG Peschmä

fork
10-10-2004, 22:43
> und was wird aus dem da?
> # Schwierigkeit 2: Es können auch ".." in den Pfadangaben sein.

So'n Mist da denkt auch noch jemand mit. Aber man kann ja den relativen Pfad in einen absoluten umwandeln und dann erst das oben genannte. :)


D=`dirname "$relpath"`
B=`basename "$relpath"`
abspath="`cd \"$D\" 2>/dev/null && pwd || echo \"$D\"`/$B"
gefunden bei Shelldorado (http://www.shelldorado.com/shelltips/script_programmer.html#cmdloc)

-----

Dazu der passende Mathematikerwitz:

Ein Mathematiker und ein Ingenieur bekommen 2 Aufgaben gestellt:

Aufgabe 1:
Es steht ein Kühlschrank mit Bratwürsten drin neben einem Herd und einer Pfanne. Bereiten Sie eine Bratwurst zu.

Das ist für beide kein Problem.

Aufgabe 2:
Wie Aufgabe 1 nur das der Kühlschrank jetzt im Keller steht.

Der Ingenieur holt sich seine Bratwurst aus dem Keller und brät Sie ohne Zwischenfälle.

Der Mathematiker hat es auch nach ca. 2 Stunden mit allen erdenklichen Hilfsmitteln geschafft den Kühlschrank alleine aus dem Keller hoch neben den Herd zu schleppen. Da jetzt das Problem auf ein bereits bekanntes zurückgeführt war konnte er in aller Ruhe die Bratwurst braten.

michael.sprick
10-10-2004, 22:45
muss es ein Shell Skript sein? Wenn nein, dann hier eine Möglichkeit, daß mit Perl zu erledigen...da wird dann auch nicht temporär eine Datei angelegt oder sowas...
Das Skript gibt ne 0 zurück, wenn die Datei nicht existiert und eine 1 wenn es bereits einen gleichnamigen Eintrag gibt.
Dann kannst Du das in weitere Shell Skripte einbauen und mit test bzw. [ ] abfragen...



#!/usr/bin/perl -w
use strict;

my $retval=0;
my $Datei = $ARGV[0];
my @Pfade = split(/:/,$ENV{PATH});

chomp($Datei);
foreach my $Pfad (@Pfade)
{
print "Suche nach ".$Pfad .'/'. $Datei."...\n";
if(-e $Pfad.'/'.$Datei)
{
$retval=1;
last;
}
}
exit($retval);



hth, Michael

michael.sprick
11-10-2004, 07:59
Oh - sorry.... ich habe totalen Blödsinn gepostet.
Evtl. hätte ich Deinen Thread mal richtig lesen sollen :rolleyes:
Das PerlSkript überprüft nur, ob es eine als Parameter angegebene Datei irgendwo in $PATH bereits gibt. Sorry...

tomes
11-10-2004, 17:50
Was spricht eigendlich gegen das gute Alte -e ???

if [ -e $pfad_1 ] ;then
echo "File $pfad_1 existiert"
else
echo "File $pfad_1 existiert nicht"
fi


tomes
EDIT:


.
-e <datei> datei existiert
-r <datei> datei existiert und Leserecht
-w <datei> datei existiert und Schreibrecht
-x <datei> datei existiert und Ausführungsrecht
-f <datei> datei existiert und ist einfache Datei
-d <datei> datei existiert und ist Verzeichnis
-h <datei> datei existiert und ist symbolisches Link
-s <datei> datei existiert und ist nicht leer
usw.

peschmae
11-10-2004, 18:18
Was spricht eigendlich gegen das gute Alte -e ???

Nichts ausser das das in dem Zusammenhang nicht gefragt ist. Siehe Frage. ;)

MfG Peschmä

tomes
11-10-2004, 18:55
Achso, jetzt verstehe ich ;)
Dann ebend einfach

.
file=`echo $pfad_1 | sed s/.*[\/]//g`
dir=`echo $pfad_1 | sed s/$file//g`
if [ -d $dir ] ;then
Verzeichniss exisitiert
else
Mach was
fi


tomes