No bash, como posso renomear um arquivo sem repetir o caminho? [duplicado]


39

Possível duplicado:
reutilizar texto em um comando bash

Se quiser renomear um arquivo com alguns diretórios, como evitar a repetição do caminho?

Por exemplo:

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

Gostaria de saber se existe uma maneira de fazer isso:

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

Onde (?)haveria uma maneira de dizer "no mesmo diretório".

Respostas:


26

Usando a expansão do histórico do bash :

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

onde !#:1:hsignifica: na linha em que você está digitando ("! #"), pegue a primeira palavra (": 1") e, em seguida, pegue apenas o componente do caminho (": h" - a cabeça).


Este é o mais próximo do que o questionador original supôs que a solução poderia ser e é útil saber, então +1.
— crazy2be

2
Legal! Eu acho que o método de expansão da cinta de Darth é mais fácil, mas é exatamente isso que eu pedi.
— Nathan Long

Eu aprendi duas grandes coisas novas hoje. Além disso, sempre pensarei na expansão da cinta como "expansão da cinta de Darth", porque parece incrível.
— PileOfMush

62

Você pode usar a expansão de chaves: mv path/to/{old_filename.txt,new_filename.txt}

Aqui está um link para o guia GNU sobre expansão de chaves no shell bash, que define uma lista de substitutos e diz ao bash para repetir o parâmetro usando um substituto diferente cada vez que se repete.

Por exemplo,

a{b,c,dd,e}

será expandido para

ab ac add ae

A única ressalva é que as repetições expandidas devem poder se seguir como argumentos para o programa de destino.


5
Ou mantê-lo ao mínimo: mv path/to/{old,new}_filename.txt. Isso também ajuda a reversão ou outros tipos de repetição quase imediata do comando. Eu já fiz muitas vezes mv /etc/X11/xorg.conf{,.backup}, por exemplo , ser capaz de reverter o processo com a simples mudança mv /etc/X11/xorg.conf{.backup,}.
— 22812 Daniel Andersson

26

A resposta de Darth acima é inteligente, mas se você quiser usar uma abordagem cd, considere também usar um subshell:

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

Como a mudança de diretório ocorre no subshell, na verdade você não mudará os diretórios no seu shell interativo.


1
Desvantagem significativa: você não pode usar a conclusão de tabulação para old_filename.txt.
— precisa saber é o seguinte

9

Outra alternativa útil, se você deseja executar vários comandos no diretório, é esta:

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

5

Eu gosto da resposta de @ Darth . Aqui está uma alternativa:cd path/to && mv oldfile newfile && cd -


1
Observe que, se mvfalhar (por exemplo, sem permissões), você será deixado no path/todiretório. Você pode tentar cd path/to && mv oldfile newfile ; cd -garantir que cd -sempre seja executado, exceto se cd path/to(sem permissões) falhar, você ainda executará cd -e irá para o diretório anterior que é indesejado. A resposta do sub-shell mlc (+1) é melhor. Eu acho que cd . && cd path/to && mv oldfile newfile ; cd -iria funcionar 99,9% do tempo (com cd .só não se você ou seus diretórios atuais permissões alteradas, e, nesse caso, indo para a dir diferente não é tão ruim de um resultado.
— dr jimbob
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.