Entfernen von Doppelpunkten im Verzeichnisnamen

7

Derzeit enthält das Verzeichnis, das automatisch für ein Programm erstellt wird, mit dem ich arbeite, Doppelpunkte ( :), die Probleme verursachen, wenn ich versuche, das Verzeichnis zu bearbeiten . Könnte mir jemand helfen, zuerst diesen Doppelpunkt zu entfernen und dann cdin das umbenannte Verzeichnis zu gelangen? (Also müsste ich wohl den neuen Verzeichnisnamen einer Variablen gleichsetzen?)

Beispiel:

  • aktueller Verzeichnisname: Lang-32b-Branch:Line
  • gewünschter Verzeichnisname: Lang-32b-BranchLine
Keks
quelle
"[Der Doppelpunkt] erstellt Probleme, wenn ich versuche, das Verzeichnis zu manipulieren" - Welche Probleme meinen Sie? Der Doppelpunkt ist meistens ein anderer Charakter (unter Ubuntu), er sollte keine Probleme verursachen.
Konrad Rudolph
1
Ich habe eine andere Software, die im Verzeichnis navigieren muss, und der Doppelpunkt spielt überhaupt nicht gut (da eine JAR-Datei gemäß dem Namen des Verzeichnisses erstellt wird).
Keks
Um Ihnen die Arbeit zu erleichtern, können Sie auch die Tab-Vervollständigung verwenden, nachdem Sie einen Teil des Verzeichnisnamens eingegeben haben. Dadurch wird der Doppelpunkt automatisch für Sie ausgeblendet.
Nonny Moose

Antworten:

12

Um dies manuell zu erreichen, können Sie auf einfache Weise den mvBefehl mit einem starken Anführungszeichen verwenden, um sicherzustellen, dass die Shell den Doppelpunkt nicht als Sonderzeichen interpretiert:

mv 'Lang-32b-Branch:Line' 'Lang-32b-BranchLine' && cd 'Lang-32b-BranchLine'

Ein alternativer Ansatz besteht darin, eine Variable und eine der Funktionen der Bash-Parametererweiterung zu verwenden. Dies kann nützlicher sein, wenn Sie diese Änderung des Verzeichnisnamens in ein Skript automatisieren möchten:

dir=Lang-32b-Branch:Line
mv "$dir" "${dir//:/}"

Die Erweiterung von "${dir//:/}"ersetzt jedes Auftreten des Doppelpunktzeichens durch nichts und ergibt das erwartete Ergebnis von Lang-32b-BranchLine. Die Verwendung "${dir/:/}"würde dazu führen, dass nur das erste Auftreten des Doppelpunkts entfernt wird, obwohl dies für Ihr Beispiel immer noch funktioniert.

Als Einzeiler zum Verschieben und CD in das Verzeichnis:

dir=Lang-32b-Branch:Line ; mv "$dir" "${dir//:/}" && cd "${dir//:/}"

Oder wenn Sie den geänderten Verzeichnisnamen in einer Variablen namens new_dir erfassen möchten:

dir=Lang-32b-Branch:Line ; new_dir="${dir//:/}"; mv "$dir" "$new_dir" && cd "$new_dir"

Eine großartige Anleitung zur Erweiterung der Bash-Parameter finden Sie hier .

Arronisch
quelle
Perfekt! Danke auch für den Link, es hilft mir sicherlich, meinen Kopf darum zu wickeln
Keks
$_enthält immer das letzte Argument des zuletzt aufgerufenen Befehls (siehe meine Antwort unten) - das kann viel Tipparbeit sparen! Die Tastenkombination für die sofortige Eingabe lautet Alt+.. ${dir//:/}kann weiter verkürzt werden auf ${dir//:}.
Nachtisch
Ich dachte, ich könnte das letzte / in der Erweiterung abschaffen, war mir aber nicht 100% sicher, @dessert. Ich benutze oft Alt+.auf Cli, aber nie wirklich $_. Danke für die zusätzlichen Tipps!
Arronical
3
Welche Shell interpretiert :als Sonderzeichen (außerhalb der Erweiterung der Geschichte und als Operator, was hier irrelevant ist)?
Konrad Rudolph
1
@KonradRudolph Möglicherweise könnte es ein Problem sein, ein: in einem Verzeichnisnamen zu haben, weil $PATH... (Ich sage nicht, dass es im Fall des OP relevant ist, sondern dass es eine Möglichkeit ist - eine, die mir sofort in den Sinn kam, aber keine Ich habe auch viel darüber nachgedacht.)
Pryftan
8

Wenn Sie möchten, dass ein allgemeiner Befehl mehrere Dateien und / oder Verzeichnisse mit einem oder mehreren Doppelpunkten umbenennt, können Sie Folgendes verwenden rename:

rename 's/://g' *

Danach können cdSie wie gewohnt (ohne Anführungszeichen) in eines der von Ihnen geänderten Verzeichnisse wechseln.


Alternative Befehlszeile gemäß den Tipps in den Kommentaren von @DavidFoerster und @dessert,

rename 's/://g' *\:*/
  • Wenn Sie die Umbenennungsaktionen auf Verzeichnisse beschränken möchten, sollten Sie nach dem Platzhalter einen Schrägstrich einfügen.
  • Sie können auch einen Doppelpunkt in den Platzhalterausdruck einfügen, um die Auswahl der Dateien auf diejenigen zu beschränken, die einen Doppelpunkt im Dateinamen enthalten. Dies kann die Aktion beschleunigen, wenn eine große Anzahl von Verzeichnissen durchsucht werden soll.

Bearbeiten:

@EliahKagan schlägt vor, mit der Option -n, "trocken" zu beginnen.

rename -n 's/://g' *

Hiermit wird nur ausgedruckt, welche Umbenennungsvorgänge ausgeführt werden würden. Anschließend kann es erneut ausgeführt werden, wobei die Option -n entfernt wird, um die Dateien tatsächlich umzubenennen. Dies hilft, Fehler wie das versehentliche Umbenennen einer Reihe von Dateien zu vermeiden, die man eigentlich in Ruhe lassen wollte.

Sudodus
quelle
3
Bei der Verwendung renameempfehle ich, es -nzuerst mit rename -n 's/://g' *auszuführen (zum Beispiel :) , wodurch nur ausgedruckt wird, welche Umbenennungsvorgänge ausgeführt werden würden. Dann kann es erneut ausgeführt werden, wobei die -nOption entfernt wird, um die Dateien tatsächlich umzubenennen. Dies hilft, Fehler wie das versehentliche Umbenennen einer Reihe von Dateien zu vermeiden, die man eigentlich in Ruhe lassen wollte.
Eliah Kagan
4

Wenn es nur das eine Verzeichnis ist, das Sie verwenden können mvund cd. So nutzen Sie die Möglichkeiten der bashVerlaufserweiterung und den speziellen Parameter $_:

mv Lang-32b-Branch:Line !#:$:s/:/ && cd $_

!#:$:s/:/ist mit dem letzten Wort (ersetzt $) des aktuellen Befehlszeile ( !#), in dem die ersten :wird sdurch nichts ubstituted. Wenn Sie möchten, dass jeder Doppelpunkt entfernt wird, ändern Sie ihn in ( lobal). wird einfach durch das letzte Argument des letzten Befehls ersetzt.!#:$:gs/:/g$_

Dessert
quelle