Wechseln Sie das Verzeichnis zum Ziel des Verschiebevorgangs

12

Gelegentlich habe ich eine Datei bearbeitet und möchte sie in einen anderen Ordner verschieben. (In der Regel: in einen Dropbox-Ordner, in dem ich nicht arbeiten wollte, um zu vermeiden, dass die anderen Besitzer des Ordners konstante Updates erhielten.) Ich mache das zum Beispiel mit

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

Danach möchte ich oft das Verzeichnis in das Zielverzeichnis meiner vorherigen Verschiebeoperation ändern. Ich finde den Pfeil nach oben, lösche das letzte file.pdf , halte nach links, lösche mv file.pdf und ersetze es durch cd .

Gibt es dafür einen schnelleren und klügeren Weg? Gibt es einen Befehl "Datei verschieben und dann Verzeichnis wechseln auf" oder eine Verknüpfung für das zuletzt verwendete Verzeichnis oder etwas ähnliches?

    
Mees de Vries 02.03.2017, 16:41
quelle

3 Antworten

17

Wenn Sie bash verwenden, hat seine History-Interaktion nur die Abkürzung dafür. Der Wortbezeichner für das letzte Argument des vorherigen Befehls:

  

!!:$
  bezeichnet das letzte Argument des vorhergehenden Befehls. Das mag sein   verkürzt auf !$ .

Kombiniert mit einem Modifizierer , um die letzte Pfadnamen-Komponente zu entfernen:

Nach dem optionalen Wortbezeichner können Sie eine Sequenz aus einem oder mehreren hinzufügen gültige Modifikatoren , denen jeweils ein ':' vorangestellt ist.

  

h
   Entfernen Sie eine nachgestellte Pfadnamen-Komponente und lassen Sie nur den Kopf.

Also:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

Die gleiche Verknüpfung kann auch mit zsh verwendet werden.

    
muru 02.03.2017, 16:48
quelle
4

Wenn Sie den Dateinamen nicht ändern, können Sie ihn weglassen, und mv fügt ihn automatisch hinzu. Dies ist besonders nützlich, wenn Sie mehrere Dateien verschieben:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Mit dem Verzeichnis als letztes Argument können Sie !!:$ oder !$ verwenden, wie murus Antwort beschreibt.
Wenn Sie bash mit den üblichen Voreinstellungen verwenden, können Sie stattdessen Alt + . verwenden (Dies ist der Befehl readline insert-last-argument ; bind -p listet alle Ihre aktuellen Bindungen auf.)

    
deltab 02.03.2017 19:04
quelle
-1

Ein anderer Ansatz besteht darin, einen eigenen Befehl für diesen Zweck zu erstellen. Dies kann über die Funktion erfolgen, die wie folgt aussieht:

$ function mv-special { mv  ; cd $(dirname $(echo -)); }

Dabei gilt: (1) mv-special ist der Funktionsname; (2) Die Variablen und sind Argumente in der Funktion, die von den Befehlen mv und cd ; (3) $(echo -) fügt am Ende der Zeichenfolge in var ein Wildcat-Zeichen ein und behebt das Verhalten von dirname wenn die Variable nur Pfad enthält; (4) $(dirname $(echo -)) filtert nur den Pfad von .

Laut dieser Antwort könnte die Funktion folgendermaßen aussehen:

$ function mv-special { mv  ; cd ${2%/*}; }

Dabei gilt: ${2%/*} filtert nur den Pfad von .

Um als Befehl verfügbar zu sein, muss diese Funktion exportiert sein :

$ export -f mv-special

Verwendung:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

oder:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Bitte beachten Sie - für beide Varianten muss das zweite Argument ( ) mit Dateiname oder Schrägstrich ( / ) enden.

Damit unser neuer Befehl permanent verfügbar ist, müssen die Definition der Funktion und der Exportbefehl an ~/.bashrc :

angehängt werden
# My custom 'mv-special' command:
function mv-special { mv  ; cd $(dirname $(echo -)); }
export -f mv-special

oder:

# My custom 'mv-special' command:
function mv-special { mv  ; cd ${2%/*}; }
export -f mv-special

Ein benutzerdefinierter Befehl kann über eine ausführbare Skriptdatei erstellt werden, die in ~/bin oder in /usr/sbin platziert wird: Wie kann ich einen benutzerdefinierten Terminalkommando erstellen (um ein Skript auszuführen)? Aber um ehrlich zu sein, war ich mit einem Problem mit dem Verhalten von cd in diesem Szenario.

    
pa4080 03.03.2017 12:26
quelle

Tags und Links