Wechseln Sie das Verzeichnis zum Ziel des Verschiebevorgangs

12

Gelegentlich habe ich eine Datei bearbeitet und möchte sie in einen anderen Ordner verschieben. (Normalerweise: in einen Dropbox-Ordner, in dem ich nicht arbeiten wollte, um zu vermeiden, dass die anderen Besitzer des Ordners ständig aktualisiert werden.) Ich mache dies zum Beispiel mit

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

Danach möchte ich häufig das Verzeichnis in das Zielverzeichnis meiner vorherigen Verschiebeoperation ändern. Ich tippe auf den Aufwärtspfeil, lösche das Finale file.pdf, halte links, lösche mv file.pdfund ersetze es durch cd.

Gibt es eine schnellere und intelligentere Möglichkeit, dies zu tun? Gibt es einen Befehl "Datei verschieben und dann Verzeichnis wechseln in" oder eine Verknüpfung für das zuletzt verwendete Verzeichnis oder ähnliches?

Mees de Vries
quelle
1
Wenn Sie STRG + Links gedrückt halten, wird das Wort schneller nach links verschoben
cat
Nebenkommentar, keine Antwort auf Ihre Shell-Frage: Normalerweise pausiere ich Dropbox während der Bearbeitung. Es stellt auch sicher, dass keine anderen Dateien "unter meinen Füßen" geändert werden.
Constantino Tsarouhas

Antworten:

17

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

!!:$
bezeichnet das letzte Argument des vorhergehenden Befehls. Dies kann auf gekürzt werden !$.

Kombiniert mit einem Modifikator , um die letzte Pfadname-Komponente zu entfernen:

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

h
Entfernen Sie eine nachfolgende Pfadnamenskomponente, wobei nur der Kopf übrig bleibt.

So:

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

Dieselbe Verknüpfung kann auch mit zsh verwendet werden.

muru
quelle
1
Das ist so cool.
Elder Geek
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 !$als Antwort des Murus beschreiben.
Wenn Sie bash mit den üblichen Standardeinstellungen verwenden, können Sie stattdessen Alt+ .verwenden.
(Dies ist der insert-last-argumentBefehl readline ; bind -plistet alle Ihre aktuellen Bindungen auf.)

Deltab
quelle
1
Beachten Sie, dass der Zieldateinamen Weglassen kann geräuschlos die Zieldatei überschrieben werden, wenn es bereits existis
Katze
mvÜberschreibt Zieldateien immer unbemerkt, es sei denn, Sie geben die Optionen -i/ --interactiveoder -n/ an --no-clobber. Deshalb habe ich alias mv='mv -i' cp='cp -i'in meinem .bashrc.
David Foerster
-1

Ein weiterer Ansatz besteht darin, einen eigenen Befehl für diesen Zweck zu erstellen. Dies kann über eine Funktion erfolgen, die wie folgt aussehen könnte:

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

Wobei: (1) mv-special der Funktionsname ist; (2) die Variablen $1und $2sind Argumente in der Funktion, die von den Befehlen mvund verwendet werden cd; (3) $(echo $2-) Fügt am Ende der Zeichenfolge in var ein Wildcat-Zeichen hinzu $2und korrigiert das Verhalten, dirnamewenn die Variable $2nur path enthält. (4) $(dirname $(echo $2-)) filtert nur den Pfad von $2.

Nach dieser Antwort könnte die Funktion so aussehen:

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

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

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

$ 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, dass für beide Varianten das zweite Argument ($2 ) mit Dateiname oder Schrägstrich ( /) enden muss .

Damit unser neuer Befehl dauerhaft verfügbar ist, müssen die Definition der Funktion und der Exportbefehl an Folgendes angehängt werden ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

oder:

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

Bildbeschreibung hier eingeben


Ein benutzerdefinierter Befehl kann über eine ausführbare Skriptdatei erstellt werden, die sich in ~/binoder in befindet /usr/sbin: Wie kann ich einen benutzerdefinierten Terminalbefehl erstellen (um ein Skript auszuführen)? Aber um ehrlich zu sein, hatte ich Probleme mit dem Verhalten cdin diesem Szenario.

pa4080
quelle