cp- oder mv-Dateien in dasselbe Verzeichnis, in dem sie sich bereits befinden, wenn ich mich in einem anderen befinde?

12

Wenn ich drin bin ~/blobund eine Akte drin habe~/blob/a_long_directory_name/c/x.x

ich kann tippen

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Gibt es eine Verknüpfung, mit der ich etwas Kürzeres eingeben kann, das den Verzeichnispfad im ersten Parameter verwendet (nicht jedoch mein aktuelles Verzeichnis), z

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

wo so etwas $same_dirauf das Verzeichnis von Parameter 1 zeigen würde

Michael Durrant
quelle

Antworten:

8

Um die Anzahl der Eingaben zu minimieren, ist es wahrscheinlich am einfachsten, dies in zwei Schritten zu tun. CD in das Verzeichnis und dann verschieben.

Wenn Sie nur einen Befehl haben, können Sie eine Subshell verwenden:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Das heißt, das cdwird nur in der Subshell wirksam, das mvwird nur passieren, wenn das cderfolgreich ist, und das Arbeitsverzeichnis Ihrer aktuellen Shell wird sich nicht ändern.

Wenn Sie mehr als einen Befehl haben, verwenden Sie den Verzeichnisstapel.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd
Alan Shutko
quelle
Dies betrifft nicht den even_morerelativen Pfad ...
Nutzlos
Das ist richtig. Das Beispiel $ same_dir schien es ebenfalls zu ignorieren.
Alan Shutko
+1 Ich mag es. Sehr leicht zu merken und zu tun und das ist der Schlüssel zu mir
Michael Durrant
Interessant, da es nicht das tut, wonach Sie gefragt haben. Vielleicht ist Ihre Frage nicht genau das, was Sie beabsichtigt haben?
Nutzlos
Nutzlos, ich habe meinen Titel aktualisiert, um zu verdeutlichen, dass es sich um cp / mv-Dateien handelt, und behalte sie in demselben Verzeichnis, auch wenn ich mich in einem anderen befinde. Übrigens ist dein Benutzername süß, aber es lässt Kommentare albern aussehen, wenn sie in ihnen verwendet werden :)
Michael Durrant
26

Mit bash können Sie eine Klammererweiterung verwenden

mv blob/a_long_directory_name/{c/x.x,evenmore/y.y}
iruvar
quelle
5

Sie können die Textersetzungsfunktionen Ihrer Shell verwenden. In bashkönnten Sie ein Biest wie:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Um es aufzuschlüsseln:

!# ist die aktuell eingegebene Zeile

:$fordert Sie auf, das letzte Wort der betreffenden Zeichenfolge ( in diesem Fall) nauszuwählen (durch eine Zahl zu ersetzen, um das letzte Wort auszuwählen ). Das letzte Wort der bisher eingegebenen Zeile wäre das vorherige Wort.n!#

:gs^xx^yyFührt eine globale ( g) Textsubstitution ( s) für das resultierende Wort durch und ersetzt 'xx' durch 'yy'. ^ist nur ein Begrenzer für den sBefehl, der die Verwendung /in Ihren Mustern zulässt .

Diese Methode ist etwas allgemeiner, da Sie einen beliebigen Teil des Pfads ('xx') durch ein beliebiges anderes Wort ('yy') ersetzen können.

Wie bei jeder Manipulation des Verlaufs empfiehlt es sich, entsprechende Shell-Optionen festzulegen (z ~/.bashrc. B. in ). In diesem Fall

shopt -s histverify

zeigt die bearbeitete Zeile an, nachdem Sie die Eingabetaste gedrückt haben, sodass Sie sie weiterhin bearbeiten und auf Fehler überprüfen können.

Warum Sie ein solches Konstrukt verwenden, ist mir nicht sicher, aber in diesem Fall funktioniert es.

Wojtek Rzepala
quelle
a) Zu viel Leitungsrauschen (Vergleich zu einem eleganten Klammer Expansion) b) löst nicht das Problem des OP: Sie wollen ersetzen c/x.xmit evenmore/y.yBeibehaltung der ursprünglichen Pfadpräfix.
Joseph R.
Ihr zweiter Kommentar war eine einfache Auslassung von meiner Seite, für deren Korrektur eine einfache Bearbeitung erforderlich war. Ich verstehe nicht, wie diese Antwort eine Ablehnung verdient hat. Mit der Bearbeitung (technisch) wird das Problem behoben, und es ist allgemeiner, da jeder Teil des Pfades ausgetauscht werden kann (ich habe oft etwas Ähnliches verwendet $PWD). Sicher, vielleicht ist es nicht das eleganteste, aber es weist auf die Tatsache hin, dass die Shell textuelle Ersetzungen und Wortbezeichner enthält, die einige Benutzer möglicherweise für die Recherche noch nützlich finden.
Wojtek Rzepala
IN ORDNUNG. Ich stehe korrigiert.
Joseph R.