Hi,
Ich befinde mich z.b: im Verzeichnis "/var/lib/"
In diesem Verzeichnis habe ich einen Ordner welcher im Namen variieren kann.
Wie kann ich den Namen dieses Ordners per Script auslesen ?
Gruss, Bert
Hi,
Ich befinde mich z.b: im Verzeichnis "/var/lib/"
In diesem Verzeichnis habe ich einen Ordner welcher im Namen variieren kann.
Wie kann ich den Namen dieses Ordners per Script auslesen ?
Gruss, Bert
wie wäre es mit pwd?
man pwd:
PWD(1) FSF PWD(1)
NAME
pwd - Den Namen des aktuellen Arbeitsverzeichnisses ausgeben
UBERSICHT
pwd [OPTION]
BESCHREIBUNG
Gebe den gesamten Dateinamen des aktuellen Verzeichnisses aus..
--help zeige diese Hilfe an und beende das Programm
--version
gib Versionsinformation aus und beende das Programm
AUTOR
Geschrieben von Jim Meyering.
BUGS MELDEN
Berichten Sie Fehler an <bug-sh-utils@gnu.org>.
COPYRIGHT
Copyright (C) 2000 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es gibt keine Garantie; auch nicht fur VERKAUFBARKEIT oder FUR SPEZIELLE ZWECKE.
GNU sh-utils 2.0.11 Mai 2001 PWD(1)
lines 1-31/31 (END)
Alles anzeigen
"find -type d" sucht alle directorys im aktuellen verzeichnis.
ZitatOriginally posted by Bert
Ich befinde mich z.b: im Verzeichnis "/var/lib/"
In diesem Verzeichnis habe ich einen Ordner welcher im Namen variieren kann.
Wie kann ich den Namen dieses Ordners per Script auslesen ?
Das ist aber was anderes, als das Topic "verspricht"!
Wenn Du wirklich das aktuelle uebergeordnete Verzeichnis haben willst:
Und das aktuelle:
Hi,
Danke Euch Allen erstmal, aber hmm ich glaub ich hab mich schlecht ausgedrückt.
Ich schreib mal was ich vorhabe;
Hab hier ausserm Vdr noch nen anderen SatReceiver der auf ne Usb Platte
aufnehmen kann.
Diese Aufnahmen will ich natürlich am Pc zu ner Dvd verarbeiten können.
Diese Aufnahmen liegen wie folgt vor;
Ein Ordner mit der Bezeichnung Braveheart 27-10-2008
In diesem Ordner liegen die relevanten Files
wie folgt;
Braveheart 27-10-2008.trp
Braveheart 27-10-2008.001
Braveheart 27-10-2008.002
Nun möchte ich ein Script drauf loslassen können welches mir zunächst die
einzelnen Teile der Aufnahme zusammenmerged.
Mittels cat wär das auch kein Problem, danach dann halt ProjectX
etc.. bis hin zur fertigen Dvd.
Dazu habe ich hier ein Verzeichnis "/var/lib/" in welches ich den gesammten Ordner in diesem Beispiel Braveheart 27-10-2008 hineinschiebe.
Aber wie kann das Script nun wissen welchen Namen der Ordner Braveheart 27-10-2008 trägt denn der heisst ja ein anderes mal wieder anders
(z.b: Stirb Langsam 05-12-2008 je nachdem wie die Aufnahme halt heisst
> variiert also).
Muss ja das Script auf (in diesem Beispiel Braveheart 27-10-2008) anwenden können.
Denn ich muss dann im Ordner die einzelnen Files der Aufnahme auch umbenennen lassen denn die Leerzeichen machen ja ein Problem schon
beim mergen mittels cat.
Der Ordner Braveheart 27-10-2008 selbst müsste auch umbenannt werden
da er ja ebenfalls ein Leerzeichen enthält und ich das Ergebnis auch als Titel verwenden will.
Wenn erst mal das Umbenennen und das mergen klappt ist der Rest
ja recht leicht zu verwirklichen.
Sicher mittels ls -l und auch mit
ls -d /var/lib/*-* wie von Walter, dg9ep vorgeschlagen kriegt man bestimmt was hin ebenso mit;
find -type d wie von slime, aber ich dachte da gibts vielleicht bessere Lösungen
mit pwd jedenfalls ist mir das nicht ganz klar denn das zeigt mir ja das
aktuelle Verzeichnis in dem ich stehe an
also wenn im Script der Befehl;
cd /var/lib
steht, dann zeigt mir ein anschliessendes pwd auch /var/lib an.
Ich bräuchte da ber dann ne Ausgabe wie;
/var/lib/Braveheart 27-10-2008
Gruss, Bert
Ich bin mir nicht sicher, ob ich Dich richtig verstehe.
Du hast im Ordner /var/lib Verzeichnisse.
cd /var/lib
Du moechtest ein Script, das aus allen Eintraegen dort irgendwas macht, wenn es Verzeichnisse sind
for i in * ; do
if [ -d "${i}" ] ; then
echo "tu es mit ${i}"
else
echo "lass es mit ${i}"
fi
done
Dazu noch Leerzeichen aus dem Namen von Verzeichnissen entfernen
for i in * ; do
if [ -d "${i}" ] ; then
echo "tu es mit $(echo ${i}|sed -e 's/ //g') ohne Leerzeichen"
else
echo "lass es mit ${i}"
fi
done
Hallo Bert,
wenn ich Deine Fragen richtig verstehe, möchtest Du in Deinem Beispiel "Braveheart" rausfinden und das Datum überspringen?!?
Sowas könntest Du machen, indem Du find nach den index-Dateien suchen läßt (also bei Dir z.B. die *.trp) und auf den kompletten Pfad 2mal dirname anwendest.
Beim ersten dirname wird die Datei vom Pfad entfernt und beim 2. Aufruf fällt dann der Zeitstempel wech.
Bei Serien mit Untertitel müsstest Du das dan 3mal machen
dirname ist übrigens das Gegenstück zu basename, welches Dir den Dateinamen liefert, also z.B. das "Braveheart" ohne /var/lib davor.
Gruß Geronimo
Hi ihr Beiden,
Danke erst mal für die Tipps!
Zitatich bin mir nicht sicher, ob ich Dich richtig verstehe.
Du hast im Ordner /var/lib Verzeichnisse.
Ja fast richtig verstanden > in /var/lib liegt hier dann immer nur ein Ordner
in meinem jetzigen Beispiel also Braveheart 27-10-2008
Diesen soll das Script herausfinden und automatisch in Braveheart umbenennen
(da wären dann die Leerzeichen weg und auch das Datum brauch ich ja auch nicht).
Weiters will ich mit dem Script dann den Namen des Ordners
(welcher dann schon von Leerzeichen und Datum befreit ist) als Titel für die fertige Dvd verwenden können
Weiters liegen in diesem Ordner folgende Files;
Braveheart 27-10-2008.trp
Braveheart 27-10-2008.001
Braveheart 27-10-2008.002
Das sind die relevanten Files der Aufnahme, und die sollten ebenfalls automatisch vom Script umbenannt werden (also wieder von Leerzeichen und Datum befreit werden.
Danach kommt dann der leichte Teil wie;
Mergen mit cat
Demuxen mit ProjectX
Muxen mit Tcmplex-panteltje
Authoren mit dvdwizard
Mein Problem liegt eigentlich nur darin den Ordner Braveheart 27-10-2008
automatisch durch das Script erkennen zu lassen sowie diesen und die
Files die darin liegen also;
Braveheart 27-10-2008.trp
Braveheart 27-10-2008.001
Braveheart 27-10-2008.002
vollautomatisch von Leerzeichen und Datum zu befreien (umbenennen also).
Um bei diesem Beispiel zu bleiben sollte dann der Ordner nur noch
Braveheart heissen,
und die Files darin so wie folgt;
Braveheart.trp
Braveheart.001
Braveheart.002
Wobei Braveheart auch gleich für die Titelübergabe verwendet werden soll.
Hinzu kommt dann noch das es im Ordner Braveheart 27-10-2008 je nach Aufnahmelänge auch ne Braveheart 27-10-2008.003 und Braveheart 27-10-2008.004 usw. geben könnte.
Ich hab sowas schon mal fürn Start aus dem Vdr heraus über die reccmds.conf
geschrieben, aber da war das bedeutent leichter weil da ja der Name der Aufnahme immer bekannt ist für das Script.
Man hat ja beim Vdr auch die Möglichkeit den Titel aus der info.vdr auszulesen
um ihn weiterzuverarbeiten.
Zitatwenn ich Deine Fragen richtig verstehe, möchtest Du in Deinem Beispiel "Braveheart" rausfinden und das Datum überspringen?!?
Nun ich hoffe das ist mit der Antwort oben beantwortet.
ZitatSowas könntest Du machen, indem Du find nach den index-Dateien suchen läßt (also bei Dir z.B. die *.trp) und auf den kompletten Pfad 2mal dirname anwendest.
Beim ersten dirname wird die Datei vom Pfad entfernt und beim 2. Aufruf fällt dann der Zeitstempel wech.
Bei Serien mit Untertitel müsstest Du das dan 3mal machen
dirname ist übrigens das Gegenstück zu basename, welches Dir den Dateinamen liefert, also z.B. das "Braveheart" ohne /var/lib davor.
Werd ich mir auch ansehen.
Bin aber jetzt nicht so der Überscripter hab zwar schon das ein oder andere Script gebastelt aber eigentlich stehe ich immer noch am Anfang des Scriptens > hab halt nicht so die Zeit gefunden bisher.
Aber ich werd mich bessern
Gruss, Bert
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
echo "${j} -> ${j// [0-9][0-9]-*./.}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
dir_name=${i// [0-9][0-9]-*}
echo "Verzeichnis ${i} -> ${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
Statt den 'echo ... -> ...' dann halt 'mv' zum Scharfschalten.
Christian
Hi, hopsi
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
echo "${j} -> ${j// [0-9][0-9]-*./.}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
dir_name=${i// [0-9][0-9]-*}
echo "Verzeichnis ${i} -> ${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
Das ist ja schon ne fix und fertige Lösung, und sieht auch ganz elegant aus
Danke !
Gruss, Bert
Hi,
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
mv "${j} -> ${j// [0-9][0-9]-*./.}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
dir_name=${i// [0-9][0-9]-*}
mv "Verzeichnis ${i} -> ${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
Hm, mit echo ist alles ok.
Mit mv geht leider nix.
Zitatmv: Fehlender Zieldatei-Operand hinter „'Braveheart 27-10-2008.001' -> 'Braveheart.001'“
„mv --help“ gibt weitere Informationen.
mv: Fehlender Zieldatei-Operand hinter „'Braveheart 27-10-2008.002' -> 'Braveheart.002'“
„mv --help“ gibt weitere Informationen.
mv: Fehlender Zieldatei-Operand hinter „'Braveheart 27-10-2008.trp' -> 'Braveheart.trp'“
„mv --help“ gibt weitere Informationen.
Werd nicht schlau daraus > hab ein paar Varianten probiert aber klappte nicht.
Gruss, Bert
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
echo "${j} -> ${j// [0-9][0-9]-*./.}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
dir_name=${i// [0-9][0-9]-*}
mv "Verzeichnis ${i} ${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
So sollte es gehen.
Hi, C-3PO
Nein geht nicht;
ZitatBraveheart 27-10-2008.001 -> Braveheart.001
Braveheart 27-10-2008.002 -> Braveheart.002
Braveheart 27-10-2008.trp -> Braveheart.trp
mv: Fehlender Zieldatei-Operand hinter „Verzeichnis Braveheart 27-10-2008 Braveheart“
„mv --help“ gibt weitere Informationen.
Ausserdem würden ja dann die Files im Verzeichnis nicht umbenannt.
Brauche hier statt;
echo "${j} -> ${j// [0-9][0-9]-*./.}"
das mv also;
mv "${j} -> ${j// [0-9][0-9]-*./.}"
und auch hier;
echo "Verzeichnis ${i} -> ${dir_name}"
also
mv "Verzeichnis ${i} -> ${dir_name}"
Das;
mv "Verzeichnis ${i} ${dir_name}"
oder das;
mv "Verzeichnis ${i} -> ${dir_name}"
erzeugt denselben Fehler.
Gar nicht so einfach wies scheint,
Kann es sein das das Leerzeichen im Verzeichnis das Probs verursacht ?
Denn im Script wird ja das Verzeichnis erst zum Schluss umbenannt > es wird vorher versucht die Files in dem Verzeichnis umzubenennen.
mv in der Shell klappt jedenfalls nicht bei Leerzeichen in Ordnern.
Gruss, Bert
Hi!
ZitatOriginal von Bert
Das;
mv "Verzeichnis ${i} ${dir_name}"
oder das;
mv "Verzeichnis ${i} -> ${dir_name}"
erzeugt denselben Fehler.
Ist doch klar. Durch die Anführungszeichen übergibst Du immer nur einen Wert an das mv.
Richtig (vom Aufruf her) ist
ZitatGar nicht so einfach wies scheint,
Kann es sein das das Leerzeichen im Verzeichnis das Probs verursacht ?
Nur, wenn man nicht weiß, wie man sie korrekt behandelt
Also entweder den Text, der Leerzeichen enthält, in Anführungszeichen setzen, oder jedes Leerzeichen mit \ escapen. z.B. "Text mit Spaces" oder: Text\ mit\ Spaces
Gruß,
Andreas
Hi, amair
Danke , genau das wars
Hatte es heute schon mal so ähnlich;
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
mv "${j}" -> "${j// [0-9][0-9]-*./.}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
dir_name=${i// [0-9][0-9]-*}
mv "Verzeichnis ${i}" -> "${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
Dabei hats mir die Files zerlegt > nur noch 0kb Grösse
Dank dir siehts nun so aus;
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
mv "${j}" "${j// [0-9][0-9]-*./.}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
dir_name=${i// [0-9][0-9]-*}
mv "${i}" "${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
und damit hauts nun endlich hin.
Gruss, Bert
ZitatAlles anzeigenOriginal von Bert
BashAlles anzeigen#!/bin/bash for i in *; do if [ -d "${i}" ]; then echo "Verzeichnis ${i}" pushd "$i" >/dev/null for j in *; do mv "${j}" "${j// [0-9][0-9]-*./.}" done popd > /dev/null film_name=${j// [0-9][0-9]-*} dir_name=${i// [0-9][0-9]-*} mv "${i}" "${dir_name}" echo "Film: ${film_name} im Verzeichnis ${dir_name}" fi done
und damit hauts nun endlich hin.
Gruss, Bert
Genau so war's gedacht. Sorry, daß ich Rätsel aufgegen habe, ich hatte erwartet, dass das 'mv' kein größeres Problem mehr darstellt.
Zum Weiterarbeiten stehen dann in den Variablen $film_name und $dir_name die entsprechenden Werte zur Verfügung. Sonst wär's auch kürzer gegangen.
Christian
Hi, hopsi
ZitatGenau so war's gedacht. Sorry, daß ich Rätsel aufgegen habe, ich hatte erwartet, dass das 'mv' kein größeres Problem mehr darstellt.
Na das macht ja nix, nochmals Danke das du mir so ne schöne Lösung
direkt vor die Nase gesetzt hast
Gruss, Bert
Hi,
So derweil sieht das Script dann so aus;
!/bin/sh
## VARIABLEN ##
## Verzeichnisse ##
AUFNAHME_DIR="/sdc5/kubuntu/data"
MERGE_DIR="/sdc5/kubuntu/data/gemerged"
## Ab hier beginnt der Job ##
## In das Verzeichnis der Aufnahmen wechseln
cd $AUFNAHME_DIR
## Aufnahmeverzeichnis und Aufnahmefiles darin
## umbenennen um die Aufnahmefiles spaeter mittels
## cat zu mergen (zusammenfuegen)
for I in *; do
if [ -d "${I}" ]; then
echo "Verzeichnis ${I}"
pushd "$I" >/dev/null
for J in *; do
mv "${J}" "${J// [0-9][0-9]-*./.}"
done
popd > /dev/null
FILM_NAME=${J// [0-9][0-9]-*}
DIR_NAME=${I// [0-9][0-9]-*}
mv "${I}" "${DIR_NAME}"
fi
done
## Titeluebergabe ##
## Kleinbuchstaben durch Grossbuchstaben, und
## eventuelle Leerzeichen durch Unterstriche ersetzen
TITEL="$(echo ${DIR_NAME}|tr "[a-zäöü][ ]" "[A-ZÄÖÜ][_]")"
## Moegliche Umlaute (z.b: Ä durch AE) ersetzen
shopt -s extglob
TITEL=${TITEL//Ä/AE}
TITEL=${TITEL//Ö/OE}
TITEL=${TITEL//Ü/UE}
TITEL=${TITEL//ß/SS}
## Mergen der Aufnahmefiles
mkdir -p $MERGE_DIR
cd "$AUFNAHME_DIR/$DIR_NAME"
cat *.trp *.001 *.002 > $MERGE_DIR/$TITEL.trp
Alles anzeigen
Das Ganze ist erst noch provisorisch.
Kann man das so lassen, oder gibts ne bessere Lösung ?
Könnte man die ganze Titelübergabe nicht gleich oben in der for Schleife beim mv miterledigen ?
Habs versucht, aber nix gescheites hinbekommen.
Oben in der for Schleife werden ja auch mittels mv der Ordner und die Files
darin umbenannt und so Leerzeichen entfernt.
Das klappt um beim Beispiel Braveheart 27-10-2008 als Ordner zu bleiben
sehr gut > der heist dann nur noch Braveheart.
Bei den Files darin ist das analog das Gleiche also heisst z.b: Braveheart 27-10-2008.trp dann nur noch Braveheart.trp
Aber wenn nun der Ordner nicht Braveheart 27-10-2008 sondern
Stirb Langsam 27-10-2008 heisst wird daraus Stirb Langsam
(es bleibt also ein Leerzeichen bestehen) und wenn ein Ordner
aus noch mehr Worten besteht bleiben dementsprechend auch mehrere
Leerzeichen über.
Könnte man das nicht alles gleich beim mv in der for Schleife berücksichtigen
so dass einfach keine Leerzeichen beim umbenennen bleiben egal aus wieviel
Worten der Ordner besteht ?
Gruss, Bert
#!/bin/bash
for i in *; do
if [ -d "${i}" ]; then
echo "Verzeichnis ${i}"
pushd "$i" >/dev/null
for j in *; do
ziel=${j// [0-9][0-9]-*./.}
mv "${j}" "${ziel// /_}"
done
popd > /dev/null
film_name=${j// [0-9][0-9]-*}
film_name=${film_name// /_}
dir_name=${i// [0-9][0-9]-*}
dir_name=${dir_name// /_}
mv "${i}" "${dir_name}"
echo "Film: ${film_name} im Verzeichnis ${dir_name}"
fi
done
Alles anzeigen
Nicht getestet.
Christian
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!