Cambia directory in destinazione dell'operazione di spostamento


12

Di tanto in tanto, ho modificato alcuni file e voglio spostarlo in una cartella diversa. (In genere: in una cartella Dropbox, in cui non volevo lavorare per evitare di fornire aggiornamenti costanti agli altri proprietari della cartella.) Faccio questo, ad esempio, con

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

Successivamente, mi trovo spesso a voler cambiare directory nella directory di destinazione della mia precedente operazione di spostamento. Mi trovo a colpire la freccia in su, a eliminare la finale file.pdf, a tenere la sinistra, a eliminarla mv file.pdfe sostituirla con cd.

Esiste un modo più rapido e intelligente per farlo? Esiste un comando "sposta file e poi cambia directory in" o un collegamento per l'ultima directory utilizzata o qualcosa del genere?


1
se tieni premuto CTRL + Sinistra, andrà a sinistra per parola che è più veloce
cat

Commento laterale, non una risposta alla tua domanda sulla shell: di solito metto in pausa Dropbox durante la modifica. Inoltre garantisce che nessun altro file venga modificato "sotto i miei piedi".
Constantino Tsarouhas,

Risposte:


17

Se stai usando bash, la sua interazione con la cronologia ha solo il collegamento per questo. La designazione della parola per l'ultimo argomento del comando precedente:

!!:$
indica l'ultimo argomento del comando precedente. Questo può essere abbreviato in !$.

Combinato con un modificatore per rimuovere l'ultimo componente del nome percorso:

Dopo il designatore di parole opzionale, è possibile aggiungere una sequenza di uno o più modificatori validi , ciascuno preceduto da un ':'.

h
Rimuovere un componente del percorso finale, lasciando solo la testa.

Così:

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

Lo stesso collegamento può essere utilizzato anche con zsh.


1
Questo è veramente forte.
Elder Geek

4

Se non stai modificando il nome file, puoi ometterlo e mv lo aggiungerà automaticamente; questo è particolarmente utile quando si spostano più file:

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

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

Con la directory come ultimo argomento, puoi usare !!:$o !$come descrive la risposta di Muru.
Se stai usando bash con i soliti valori predefiniti, puoi usare Alt+ .invece.
(Questo è il insert-last-argumentcomando readline ; bind -pelencherà tutti i tuoi binding correnti.)


1
si noti che l'omissione del nome file di destinazione può sovrascrivere silenziosamente il file di destinazione se esiste già
cat

mvsovrascrive sempre in silenzio i file di destinazione a meno che non specifichi le opzioni -i/ --interactiveo -n/ --no-clobber. Ecco perché ho alias mv='mv -i' cp='cp -i'nel mio .bashrc.
David Foerster,

-1

Un altro approccio è quello di creare il proprio comando dedicato a questo scopo. Questo può essere fatto tramite una funzione che potrebbe apparire come:

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

Dove: (1) mv-special è il nome della funzione; (2) le variabili $1e $2sono argomenti nella funzione che verranno utilizzati dai comandi mve cd; (3) $(echo $2-) aggiunge un carattere jolly alla fine della stringa in var $2e corregge il comportamento di dirnamese la variabile $2contiene solo percorso; (4) $(dirname $(echo $2-)) filtrerà solo il percorso da $2.

Secondo questa risposta la funzione potrebbe apparire come:

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

Dove: ${2%/*}filtra solo il percorso da $2.

Per essere disponibile come comando, è necessario esportare questa funzione :

$ export -f mv-special

Uso:

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

o:

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

Si prega di prestare attenzione a che - per entrambe le varianti - il secondo argomento ( $2) deve terminare con nomefile o barra ( /).

Per essere permanentemente disponibili per il nostro nuovo comando, la definizione della funzione e il comando di esportazione devono essere aggiunti a ~/.bashrc:

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

o:

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

inserisci qui la descrizione dell'immagine


È possibile eseguire un comando personalizzato e tramite il file di script eseguibile inserito ~/bino inserito in /usr/sbin: Come posso creare un comando di terminale personalizzato (per eseguire uno script)? Ma ad essere sincero, ho dovuto affrontare un problema con il comportamento di cdquesto scenario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.