Il modo più rapido per rinominare i file, senza dover riscrivere il percorso della directory


56

So come rinominare i file in Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Ci vuole troppo tempo per ripetere ~/folder/subfolder/filedue volte.

C'è un modo più veloce?

Risposte:


104

Se la shell supportato Espansione delle parentesi graffe (funziona con csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashcon doppietta-expand abilitato chiamando yash --brace-expando set in guscio interative con set -o brace-expando fish):

mv ~/folder/subfolder/file.{txt,sh}

4
semplice è meglio!
Braiam,

2
fantastico uso dell'espansione in shell geniale!
harish.venkat,

3
Si è impressionante, ma davvero criptico. Funziona ma a prima vista penso che faccia qualcosa di diverso: sposta due file da qualche parte. Non penso che sia una grande idea, soprattutto perché c'è una soluzione molto migliore usando rename.
yo'

4
@tohecz: Perché è criptico? È una caratteristica della shell e tutti possono conoscerla leggendo la pagina man della shell. E non credo renamesia una soluzione migliore perché renamenon ti chiedo mai di ignorare il file esistente o meno.
cuonglm,

1
@Gnouc sei l'uomo.
Beginer

20

Puoi anche usare rename(parte del pacchetto util-linux).

rename .txt .sh ~/folder/subfolder/file.txt

Vedi la pagina man rinomina per maggiori dettagli.


+1 Questo è il modo chiaro come farlo, molto meglio che fare affidamento sulla {a,b}funzionalità delle shell .
yo'

5
In alcune distro Linux (come Ubuntu), renameè un programma completamente diverso, basato su perl. Lì, useresti rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup,

Su Debian (e Ubuntu), c'è anche mmv.
ctrl-alt-delor,

10

Tutto quanto sopra è buono. Questo funzionerebbe anche:

( cd ~/folder/subfolder && mv file.txt file.sh )

No. Non funziona per me!
Hamed Kamrava,

Funzionerà se si rimuove la sudoparte.
Cthulhu,

1
@Cthulhu Sì, hai ragione. Ma perché non funziona sudo?
Hamed Kamrava,

2
@HamedKamrava Probabilmente perché con sudoesso interpreta ~la home directory della radice.
Cthulhu,

È possibile sudola mv, ma non cd. Scopri perché cd è un guscio costruito in E non è possibile. sudoIl(
ctrl-alt-Delor

6

No. Devi dare il percorso completo al file per rinominarlo. L'unica alternativa è quella di spostarsi nella cartella di destinazione prima di eseguire mv:

cd ~/folder/subfolder/
mv file.txt file.sh

In alternativa, è possibile scrivere una piccola funzione che rinomina il file nella directory di destinazione. Ad esempio, aggiungi queste righe al tuo file di inizializzazione della shell ( ~/.bashrcse stai usando bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Quindi, apri un nuovo terminale o esegui semplicemente source ~/.bashrcper rileggere il file init e puoi fare:

lmv ~/folder/subfolder/file.txt file.sh

+1 per la lmv()funzione. Non lo sapevo :)
Hamed Kamrava,

1
@HamedKamrava nessuno lo sapeva. L'ho appena scritto, non è niente di standard.
terdon

2
Lo so. Voglio dire, non sapevo di poter scrivere la mia funzione!
Hamed Kamrava,

2

Solo per espandere l'utilità della risposta di cuonglm (NON prendere alcun merito poiché amo la sua soluzione) e la sua risposta è corretta.

Il caso d'uso è che spesso vogliamo creare un file in una posizione remota (il vero problema), ad esempio /folder/subfolder/configFile.dat TO configFile.dat.orig

Questa forma del comando aggiunge un'estensione di file (non sostituendo l'estensione originale)

mv ~/folder/subfolder/file.txt{,.orig}

Spiegato: "{, .orig}" significa sostituisci (niente) alla fine del nome del file con (qualcosa) ".orig"

O per rimuovere un'estensione di file (invertire la rinomina)

mv ~/folder/subfolder/file.txt{.orig,}

Nota: ancora in tema di "Il modo più rapido per rinominare i file senza dover riscrivere il percorso dir"


1

Sì. Se lo usi bash, lo fai sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Che in realtà è più grande e potrebbe non riuscire se hai perso i permessi di accesso alla directory originale quando hai fatto il popd.


1
Che senso ha pushde popdqui? In che modo è meglio di cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon

1
Il punto è che stai seguendo il comando nella cartella che hai avviato, non in nessuna sottocartella. Un'alternativa pushd popdè usare cde tornare indietro cd -.
jofel,

L'interrogante sembrava dichiarare l'intenzione di non cambiare la directory di lavoro ed popdè migliore di cd ../../quando disponibile.
41754,

7
Usa (cd /path/to/there && mv x y)quindi (con una subshell)
Stéphane Chazelas

Davvero non si dovrebbe mettere sudoprima pushd. Quindi dovrebbe essere il comando completo pushd ...dir && sudo mv old new && popd. In alternativa, si potrebbe fare (cd ...dir; sudo mv old new)perché l'esecuzione in subshell si occuperà automaticamente delle modifiche alla directory.
Mikko Rantalainen,
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.