A maneira mais rápida de renomear arquivos, sem redigitar o caminho do diretório

56

Eu sei como renomear arquivos no Unix:

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

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

Leva muito tempo para repetir ~/folder/subfolder/fileduas vezes.

Existe uma maneira mais rápida?

Hamed Kamrava
fonte

Respostas:

104

Se o seu shell suportado Brace Expansão (funciona com csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashcom cinta-expand habilitado pelo telefone yash --brace-expandou conjunto com casca interative com set -o brace-expandou fish):

mv ~/folder/subfolder/file.{txt,sh}
cuonglm
fonte
4
o simples é o melhor!
Braiam 27/05
2
impressionante uso de expansão com casca brilhante!
harish.venkat
3
Ele é incrível, mas realmente enigmática. Funciona, mas à primeira vista eu acho que faz algo diferente: move dois arquivos para algum lugar. Eu não acho que seja uma ótima idéia, especialmente porque existe uma solução muito melhor usando rename.
yo '
4
@tohecz: Por que é enigmático? É um recurso do shell e todos podem conhecê-lo lendo a página de manual do shell. E não acho que renameseja uma solução melhor, porque renamenunca peça para você substituir o arquivo existente ou não.
cuonglm
11
@ Gnouc você é o homem.
beginer
20

Você também pode usar rename(parte do pacote util-linux).

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

Veja a página de manual renomear para mais detalhes.

jofel
fonte
+1 Esta é a maneira clara de como fazê-lo, muito melhor do que depender da {a,b}funcionalidade dos shells .
yo '
5
Em algumas distros do Linux (como o Ubuntu), renameé um programa totalmente diferente, baseado em perl. Lá, você usaria rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup
No Debian (e Ubuntu), há também mmv.
CTRL-ALT-DELOR 13/04/19
10

Todos os itens acima são bons. Isso também funcionaria:

( cd ~/folder/subfolder && mv file.txt file.sh )
Bjorn
fonte
Não. Não funciona para mim!
Hamed Kamrava
Funcionará se você remover a sudopeça.
Cthulhu
11
@Cthulhu Sim, você tem direito. Mas por que não funciona sudo?
Hamed Kamrava
2
@HamedKamrava Provavelmente porque com sudoele interpreta ~como o diretório inicial da raiz.
Cthulhu
Você pode sudoo mv, mas não cd. Veja porque cd é um shell construído em E você não pode. sudoO(
ctrl-alt-Delor
6

Não. Você precisa fornecer o caminho completo para o arquivo para renomeá-lo. A única alternativa é mover para a pasta de destino antes de executar o mv:

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

Como alternativa, você pode escrever uma pequena função que renomeia o arquivo no diretório de destino. Por exemplo, adicione estas linhas ao seu arquivo de inicialização do shell ( ~/.bashrcse você estiver usando bash):

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

Em seguida, abra um novo terminal ou apenas execute source ~/.bashrcpara reler o arquivo init e você pode:

lmv ~/folder/subfolder/file.txt file.sh
terdon
fonte
+1 para a lmv()função. Eu não sabia que :)
Hamed Kamrava
11
@HamedKamrava ninguém sabia disso. Acabei de escrever, não é nada padrão.
terdon
2
Eu sei. Quero dizer, eu não sabia que posso escrever minha própria função!
Hamed Kamrava
2

Apenas para expandir a utilidade da resposta de cuonglm (para não aceitar o crédito que eu adoro a solução dele) e a resposta dele é correta.

O caso de uso é que geralmente queremos mv um arquivo em um local remoto (o problema real), por exemplo, /folder/subfolder/configFile.dat TO configFile.dat.orig

Este formulário do comando adiciona uma extensão de arquivo (não substituindo a extensão original)

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

Explicado: "{, .orig}" significa substituir (nada) no final do nome do arquivo por (algo) ".orig"

OU para remover uma extensão de arquivo (inverta a renomeação)

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

Nota: Ainda no tópico "Maneira mais rápida de renomear arquivos sem redigitar o caminho do diretório"

spikendu
fonte
1

Sim. Se você usa bash, você usa sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

O que é realmente maior e poderá falhar se você perder as permissões de acesso ao diretório original quando o fez popd.

41754
fonte
11
Qual é o objetivo pushde popdaqui? Como isso é melhor do que cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon
11
O ponto é que você está atrás do comando de volta na pasta iniciada, não em nenhuma subpasta. Uma alternativa pushd popdé usar cde voltar com cd -.
Jofel
O questionador parecia declarar uma intenção de não alterar o diretório de trabalho e popdé melhor do que cd ../../, quando disponível.
41754 27/05
7
Use (cd /path/to/there && mv x y)então (com um subshell)
Stéphane Chazelas
Você realmente não deve colocar sudoantes pushd. Portanto, o comando completo deve ser pushd ...dir && sudo mv old new && popd. Como alternativa, você poderia fazer isso (cd ...dir; sudo mv old new)porque a execução no subshell cuidará das alterações de diretório automaticamente.
Mikko Rantalainen 12/03