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?

Nathan Long
quelle

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).

Glenn Jackman
quelle
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.

Darth Android
quelle
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.

mlc
quelle
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
KeithB
quelle
5

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

Glenn Jackman
quelle
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