file cp o mv nella stessa directory in cui sono già quando sono in un'altra?


12

Se ci sono ~/blobe ho un file in~/blob/a_long_directory_name/c/x.x

posso scrivere

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Esiste una scorciatoia per cui posso digitare qualcosa di più breve che utilizza il percorso della directory nel primo parametro (non la mia directory corrente però), ad es.

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

dove qualcosa del genere $same_dirindicherebbe la dir del parametro 1

Risposte:


8

Per ridurre al minimo la quantità di digitazione, è probabilmente più semplice farlo in due passaggi. CD nella directory, quindi spostare.

Se si dispone di un solo comando, è possibile utilizzare una subshell:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Ciò significa cdche avrà effetto solo nella subshell, mvaccadrà solo se avrà esito cdpositivo e la directory di lavoro della shell corrente non cambierà.

Se si dispone di più di un comando, utilizzare lo stack di directory.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd

Questo non affronta il even_morepercorso relativo ...
Inutile

È corretto. L'esempio $ same_dir sembrava ignorarlo.
Alan Shutko,

+1 Mi piace. Molto facile da ricordare e da fare e questa è la chiave per me
Michael Durrant,

Interessante, dal momento che non fa quello che hai chiesto. Forse la tua domanda non è esattamente quello che volevi?
Inutile

Inutile, ho aggiornato il mio titolo per chiarire che si tratta di file cp / mv e tenerli nella stessa directory, anche se mi trovo in un'altra. a proposito il tuo nome utente è carino ma fa sembrare sciocchi i commenti quando vengono utilizzati in essi :)
Michael Durrant


5

È possibile utilizzare le funzionalità di sostituzione del testo della shell. In bash, potresti usare una bestia come:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Per scomporlo:

!# è la riga corrente digitata finora

:$chiede di selezionare l'ultima parola (sostituirla con un numero nper scegliere la n'parola') della stringa in esame ( !#in questo caso). L'ultima parola della riga digitata finora sarebbe la parola precedente.

:gs^xx^yyfa la gsostituzione testuale globale ( ) ( s) sulla parola risultante, sostituendo 'xx' con 'yy'. ^è solo un delimitatore per il scomando per consentire l'utilizzo /nei modelli.

Questo metodo è leggermente più generale in quanto consente di sostituire qualsiasi parte del percorso ('xx') con qualsiasi altra parola ('yy').

Infine, come con qualsiasi manipolazione della cronologia, è bene avere le opzioni di shell appropriate impostate (ad es ~/.bashrc. In). In questo caso

shopt -s histverify

visualizzerà la riga modificata dopo aver premuto Invio, quindi è ancora possibile modificarla e verificare la presenza di errori.

Perché non dovresti usare un costrutto del genere non sono sicuro, ma funziona in questo caso.


a) Troppo rumore di linea (confrontare ad un elegante espansione delle parentesi graffe) b) non risolve il problema del PO: vogliono sostituire c/x.xcon evenmore/y.ymantenere il prefisso del percorso originale.
Joseph R.,

Il tuo secondo commento è stato una semplice omissione da parte mia, che ha richiesto una semplice modifica da correggere. Non vedo come questa risposta meritasse un voto negativo. Con la modifica (tecnicità), risolve il problema ed è più generale in quanto consente di scambiare qualsiasi parte del percorso (ho spesso usato qualcosa di simile su $PWD). Certo, forse non è il più elegante ma indica il fatto che shell ha sostituzioni testuali e designatori di parole, che alcuni utenti potrebbero ancora trovare utili per la ricerca.
Wojtek,

OK. Sono corretto.
Joseph R.,
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.