Wie cd in ein neu erstelltes Verzeichnis?

865
nnbvcn
cd "$(mkdir -v "$(date -R)"|sed s+.`(.*)'.*)" 

Damit soll ein Verzeichnis mit dem Namen erstellt werden $(date -R). Ich könnte einfach cd machen $(date -R), aber der Schuldige ist, dass sich das Datum ändern konnte, seit der vorherige Befehl ausgeführt wurde ( mkdir).

Deshalb möchte ich seine Ausgabe analysieren, um den Namen des erstellten Verzeichnisses zu ermitteln. Wie korrigiere ich den Code? Derzeit wird eine >Eingabeaufforderung angezeigt, die angibt, dass ein Angebot fehlt.

Das Ändern 'in \'ändert das Ergebnis nicht. Wenn Sie einen besseren Weg dazu haben, sagen Sie es bitte.

2
Ich habe Ihre unregistrierten Konten für Sie zusammengeführt und Ihre Antworten in Kommentare umgewandelt. Sie sollten nun in der Lage sein, diese Antwort zu akzeptieren und zu kommentieren - bis Sie Ihre Cookies erneut verlieren. In diesem Fall möchten Sie vielleicht eine Registrierung in Betracht ziehen. Andernfalls sollten Sie wissen, dass Sie ein nicht registriertes Konto als Protokoll wiederherstellen können (http://superuser.com/users/account-recovery), nachdem Sie eine gültige E-Mail-Adresse angegeben haben. DMA57361 vor 13 Jahren 2

4 Antworten auf die Frage

12
Zoredache

IMHO Sie machen etwas einfach unnötig komplex. Warum nicht einfach so etwas machen?

NEWDIR=$(date -R);mkdir "$NEWDIR";cd "$NEWDIR" 
Ihre Lösung funktioniert gut und ich akzeptiere Ihre Antwort. Ich frage mich jedoch immer noch, wie ich meinen Code aus Neugierde korrigieren kann. nnbvcn vor 13 Jahren 0
Mein 2c: `(NEWDIR = $ (Datum -R); mkdir" $ NEWDIR "&& cd" $ NEWDIR ")` Das stört die Umgebung nicht. estani vor 10 Jahren 0
4
glenn jackman

Mit bash können Sie auch die History-Erweiterung nutzen :

mkdir "$(date -R)" && cd !#:^ 
2
jw013

Der sedTeil in Ihrem Befehl ist ziemlich gebrochen. Versuche dies:

sed -e "s/.*\`\(.*\)'.*/\1/" 

Wenn Sie häufig mkdirund cdin einem Schritt möchten, probieren Sie diese Funktion (nur Bash):

mdc () { mkdir "$@" && cd "${!#}"; } 

Es wickelt sich einfach um mkdir. Verwenden Sie es wie mdc [mkdir options] newdirund stellen Sie sicher, dass es newdirzuletzt geht.

Ich habe den zweiten Teil vergessen. Es sollte lauten: cd $ (mkdir -v "$ (date -R)" | sed -r s +. * `(. *) '. * + \ 1+)" Ich habe Ihre Variante ausprobiert, aber es ergibt dasselbe Ergebnis Wenn ich es einlege: cd "$ (mkdir -v $ (Datum -R) | sed -es /.* \` ​​\ (. * \) ". * / \ 1 /)" Ihr mdc () funktioniert prima. Ich würde kommentieren, aber da ich mich nicht angemeldet habe, kann ich nur antworten, wenn ich Cookies verloren habe (wenn Sie können, ändern Sie dies bitte in einen Kommentar zur Antwort). nnbvcn vor 13 Jahren 0
Sie haben die wichtigsten Anführungszeichen um den Regex herum weggelassen, wenn Sie sie einfügen. Setzen Sie die Anführungszeichen wieder so ein, wie sie in meinen sind, und prüfen Sie, ob es so funktioniert. jw013 vor 13 Jahren 0
Nachdem ich die Zitate wieder eingefügt hatte, funktionierte es. Ich habe sie überhaupt rausgenommen, weil gedit falsche Hervorhebungen zeigte. Vielen Dank. nnbvcn vor 13 Jahren 0
1
Rich Homolka

Ein Nebenpunkt: Sie müssen nicht sedfür die Ausgabe von verwenden date, da er dateselbst einige gute Formatierungswerkzeuge hat. Wenn Sie date eine Zeichenfolge übergeben, die mit '+' beginnt, können Sie die Formatierungscodes von strftime verwenden .

$ date '+%Y-%m-%d_%H-%M-%S' 

Ich würde persönlich etwas Sortierbares für den Verzeichnisnamen verwenden, was bedeutet, dass ich "Fr" niemals als frühen Teil des Namens verwenden würde.