Soluzione 1:
per un singolo file prova
mv dir1/dir2/dir3/file.{txt,txt.old}
dove X{a,b}
costruire espandere a Xa Xb
, puoi avere un'anteprima usando
echo dir1/dir2/dir3/file.{txt,txt.old}
per vedere se soddisfa le tue esigenze.
nota:
-
quello per più file
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
è improbabile che si espanda a ciò che desideri. (questo si espanderà in un misto di file.txt file1.txt.old file2.txt ...)
-
{txt,txt.old}
può essere ridotto a{,.old}
come da commento -
se il nome della directory non è ambiguo, è possibile utilizzare caratteri jolly.
mv *1/*2/d*/*.{,old}
per più file utilizzare rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
rilascia -n
per avere una ridenominazione efficace.
Soluzione 2:
Il comando rename
rinomina tutti i file corrispondenti. Il suo scopo principale è rinominare più file, ma se l'espressione Perl corrisponde a un solo file, allora rinominerà solo questo singolo file. Per i dettagli e la sintassi specifica della distribuzione, leggere la manpage:man rename
.
Esempio di utilizzo:rinomina "/path/file.txt" in "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Notazione più breve (grazie a shalomb):
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Per una prova a secco usa rename -n
.
Ulteriori esempi e dettagli possono essere trovati su https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
Soluzione 3:
Mi piace la soluzione di @ archemar di utilizzare l'espansione {}, perché puoi usarla quando hai già avviato la tua riga di comando. Ecco alcune altre possibilità di completezza:
F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"
(le virgolette sono necessarie solo se nel nome sono presenti spazi o altri caratteri che spezzano le parole)
mymv() {
mv "$1/$2" "$1/$3"
}
mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old
Note:
- Questa è la sintassi bash, potresti usare un'altra shell
mymv
può essere qualsiasi stringa ragionevole, ho usato mymv per "la mia mossa".- La definizione della funzione può essere inserita nel tuo .bash_profile
Un altro:
cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -
ma
(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)
(da @Adam e @CharlesDuffy) è probabilmente migliore nel caso in cui il cd fallisca.
Soluzione 4:
Per un caso una tantum, se non voglio cambiare la mia directory corrente, potrei semplicemente usare una sub-shell:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
Perché tu cd
all'interno della sub-shell, non hai cambiato la tua directory nella tua attuale shell
Soluzione 5:
Se vuoi entrare nella sottodirectory per abbreviare il mv
comando, ma vuoi tornare alla directory corrente in seguito, ci sono due modi per farlo. Uno è mettere cd
e mv
in una subshell (come è già stato suggerito).
L'altro è usare pushd
e popd
per cambiare directory:
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
Il pushd
il comando è come cd
, tranne per il fatto che prima inserisce il nome della directory corrente in uno stack. popd
rimuove il primo nome dallo stack e passa a quella directory.