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.