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?


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.


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.)


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.

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.