Cambia directory in target dell'operazione di spostamento

12

Di tanto in tanto, ho modificato alcuni file e voglio spostarlo in una cartella diversa. (Tipicamente: in una cartella Dropbox, dove non volevo lavorare per evitare di dare agli altri proprietari della cartella aggiornamenti costanti.) Lo faccio, ad esempio, con

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

In seguito, spesso mi trovo a voler cambiare directory nella directory di destinazione della mia precedente operazione di spostamento. Mi trovo a colpire la freccia su, eliminando il file.pdf finale, tenendo a sinistra, eliminando mv file.pdf e sostituendolo con cd .

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

    
posta Mees de Vries 02.03.2017 - 16:41
fonte

3 risposte

17

Se stai usando bash, la sua interazione con la cronologia ha solo la scorciatoia per questo. Il designatore di parole per l'ultimo argomento del comando precedente:

  

!!:$
  designa l'ultimo argomento del comando precedente. Può essere   abbreviato in !$ .

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

Dopo il word designator opzionale, puoi aggiungere una sequenza di uno o più dei modificatori validi , ciascuno preceduto da un ':'.

  

h
   Rimuovi un componente percorso finale, lasciando solo la testa.

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

Lo stesso collegamento può essere usato anche con zsh.

    
risposta data muru 02.03.2017 - 16:48
fonte
4

Se non stai cambiando il nome del 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 di default, puoi usare Alt + . .

(Questo è il comando readline insert-last-argument ; bind -p elencherà tutti i tuoi binding correnti.)

    
risposta data deltab 02.03.2017 - 19:04
fonte
-1

Un altro approccio è creare il tuo comando dedicato a questo scopo. Questo può essere fatto tramite la funzione che potrebbe avere il seguente aspetto:

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

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

Secondo questa risposta la funzione potrebbe essere simile a:

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

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

Per essere disponibile come comando, questa funzione deve essere esportata :

$ export -f mv-special

Utilizzo:

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

o

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

Prestare attenzione a questo - per entrambe le varianti - il secondo argomento ( ) deve terminare con nomefile o barra ( / ).

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

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

o

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

È possibile creare un comando personalizzato e tramite un file di script eseguibile posizionato in ~/bin o in /usr/sbin : Come posso creare un comando terminale personalizzato (per eseguire uno script)? Ma per essere onesto, mi sono trovato di fronte a problema con il comportamento di cd in questo scenario.

    
risposta data pa4080 03.03.2017 - 12:26
fonte

Leggi altre domande sui tag