Wie kann ich in Bash eine Datei umbenennen, ohne den Pfad zu wiederholen? [Duplikat]


39

Mögliches Duplizieren:
Wiederverwenden von Text in einem Bash-Befehl

Wie kann ich vermeiden, den Pfad zu wiederholen, wenn ich eine Datei einige Verzeichnisse tief umbenennen möchte?

Beispielsweise:

mv path/to/old_filename.txt path/to/new_filename.txt

Ich frage mich, ob es einen Weg gibt, dies zu tun:

mv path/to/old_filename.txt (?)new_filename.txt

Wo (?)könnte man "im selben Verzeichnis" sagen?

Antworten:


26

Verwendung der Bash- History-Erweiterung :

mv path/to/oldfile !#:1:h/newfile

Dabei !#:1:hbedeutet: Nehmen Sie von der Zeile, die Sie gerade eingeben ("! #"), das erste Wort (": 1") und dann nur die Pfadkomponente (": h" - den Kopf).


Dies ist die Lösung, von der der ursprüngliche Fragesteller annimmt, und es ist nützlich, sie zu kennen, also +1.
crazy2be

2
Cool! Ich denke, Darths Expansionsmethode ist einfacher, aber genau darum habe ich gebeten.
Nathan Long

Ich habe heute zwei großartige neue Dinge gelernt. Außerdem werde ich die Klammererweiterung für immer als "Darths Klammererweiterung" betrachten, weil sie fantastisch klingt.
PileOfMush

62

Sie können die Klammererweiterung verwenden: mv path/to/{old_filename.txt,new_filename.txt}

Hier ist ein Link zum GNU-Handbuch zur Klammererweiterung in der Bash-Shell, das eine Liste von Substituten definiert und Bash anweist, den Parameter bei jeder Wiederholung mit einem anderen Substitut zu wiederholen.

Beispielsweise,

a{b,c,dd,e}

wird erweitert auf

ab ac add ae

Die einzige Einschränkung besteht darin, dass die erweiterten Wiederholungen als Argumente für das Zielprogramm aufeinander folgen können müssen.


5
Oder es auf ein Minimum zu halten: mv path/to/{old,new}_filename.txt. Dies hilft auch bei der Umkehrung oder anderen Arten der Wiederholung des Befehls. Ich habe es oft getan, um zB mv /etc/X11/xorg.conf{,.backup}den Prozess durch die einfache Änderung umzukehren mv /etc/X11/xorg.conf{.backup,}.
Daniel Andersson

26

Darths Antwort oben ist klug, aber wenn Sie einen Ansatz mit verwenden möchten cd, können Sie auch die Verwendung einer Subshell in Betracht ziehen:

(cd path/to && mv old_filename.txt new_filename.txt)

Da der Verzeichniswechsel in der Subshell stattfindet, werden Sie die Verzeichnisse in Ihrer interaktiven Shell nicht ändern.


1
Signifikanter Nachteil: Sie können die Tabulatorvervollständigung für nicht verwenden old_filename.txt.
bluenote10

9

Eine weitere Alternative, die nützlich ist, wenn Sie mehrere Befehle im Verzeichnis ausführen möchten, ist folgende:

pushd /path/to
mv oldfile newfile
...
popd

5

Ich mag @ Darths Antwort . Hier ist eine Alternative:cd path/to && mv oldfile newfile && cd -


1
Wenn dies mvfehlschlägt (z. B. keine Berechtigungen), bleiben Sie im path/toVerzeichnis. Sie könnten versuchen cd path/to && mv oldfile newfile ; cd -sicherzustellen, dass cd -immer ausgeführt wird, es sei denn, wenn cd path/to(keine Berechtigungen) fehlschlagen, werden Sie weiterhin ausgeführt cd -und gehen zum vorherigen Verzeichnis, das unerwünscht ist. mlc (+1) Subshell-Antwort ist besser. Ich schätze cd . && cd path/to && mv oldfile newfile ; cd -, 99,9% der Zeit würden funktionieren ( cd .nur wenn Sie oder Ihre aktuellen dirs-Berechtigungen sich ändern; und in diesem Fall ist es nicht so schlimm, zu einem anderen dir zu
wechseln
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.