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.