In bash, come posso rinominare un file senza ripetere il percorso? [duplicare]


39

Possibile duplicato:
riutilizzare il testo su un comando bash

Se voglio rinominare un file in profondità in alcune directory, come posso evitare di ripetere il percorso?

Per esempio:

mv path/to/old_filename.txt path/to/new_filename.txt

Mi chiedo se c'è un modo per farlo:

mv path/to/old_filename.txt (?)new_filename.txt

Dove (?)sarebbe un modo di dire "nella stessa directory".

Risposte:


26

Utilizzando l' espansione della cronologia di bash :

mv path/to/oldfile !#:1:h/newfile

dove !#:1:hsignifica: dalla riga che stai digitando ("! #"), prendi la prima parola (": 1"), quindi prendi solo il componente path (": h" - la testa) da essa.


Questo è il più vicino a quello che l'interrogante originale ha assunto potrebbe essere la soluzione, ed è utile sapere, quindi +1.
— crazy2be

2
Freddo! Penso che il metodo di espansione di Darth sia più semplice, ma è esattamente quello che ho chiesto.
— Nathan Long,

Oggi ho imparato due grandi novità. Inoltre, penserò per sempre all'espansione delle parentesi graffe come "espansione delle parentesi graffe di Darth" perché suona alla grande.
— PileOfMush

62

È possibile utilizzare l'espansione del controvento: mv path/to/{old_filename.txt,new_filename.txt}

Ecco un link alla guida GNU sull'espansione del controvento nella shell bash, che definisce un elenco di sostituti e dice a bash di ripetere il parametro usando un sostituto diverso ogni volta che si ripete.

Per esempio,

a{b,c,dd,e}

sarà espanso a

ab ac add ae

L'unica avvertenza è che le ripetizioni espanse devono essere in grado di susseguirsi come argomenti per il programma di destinazione.


5
O mantenere al minimo: mv path/to/{old,new}_filename.txt. Ciò aiuta anche l'inversione o altri tipi di ripetizione quasi ravvicinata del comando. Ho fatto molte volte mv /etc/X11/xorg.conf{,.backup}, ad esempio , essere in grado di invertire il processo con il semplice cambiamento mv /etc/X11/xorg.conf{.backup,}.
— Daniel Andersson,

26

La risposta di Darth sopra è intelligente, ma se vuoi usare un approccio con cd, potresti anche considerare l'uso di una subshell:

(cd path/to && mv old_filename.txt new_filename.txt)

Poiché la modifica della directory avviene nella subshell, in realtà non cambierà le directory nella shell interattiva.


1
Svantaggio significativo: non è possibile utilizzare il completamento della scheda per old_filename.txt.
— bluenote10,

9

Un'altra alternativa utile, se hai intenzione di eseguire diversi comandi nella directory, è questa:

pushd /path/to
mv oldfile newfile
...
popd

5

Mi piace la risposta di @ Darth . Ecco un'alternativa:cd path/to && mv oldfile newfile && cd -


1
Nota se mvfallisce (es. Nessuna autorizzazione) verrai lasciato nella path/todirectory. Potresti provare cd path/to && mv oldfile newfile ; cd -ad assicurarti che cd -sia sempre eseguito, tranne se cd path/to(nessuna autorizzazione) fallisce, eseguirai comunque cd -e passerai alla directory precedente che è indesiderata. La risposta alla subshell mlc (+1) è migliore. Immagino cd . && cd path/to && mv oldfile newfile ; cd -che funzionerebbe il 99,9% delle volte ( cd .fallendo solo se tu o le tue attuali autorizzazioni dirs sono cambiate; e in quel caso passare a una directory diversa non è poi così male di un risultato.
— dr jimbob
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.