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

38

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

Por exemplo:

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

Eu estou querendo saber se há uma maneira de fazer isso:

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

Onde (?) seria uma forma de dizer "no mesmo diretório".

    
por Nathan Long 16.06.2011 / 16:34

5 respostas

25

Usando o bash expansão do histórico :

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

onde !#:1:h significa: da linha que você está digitando atualmente ("! #"), pegue a primeira palavra (": 1"), então pegue apenas o componente do caminho (": h" - a cabeça ) a partir dele.

    
por 16.06.2011 / 20:46
61

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

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

Por exemplo,

a{b,c,dd,e}

será expandido para

ab ac add ae

A única ressalva é que as repetições expandidas devem seguir um ao outro como argumentos para o programa alvo.

    
por 16.06.2011 / 16:36
26

Darth's resposta acima é inteligente, mas se você quiser usar uma abordagem com cd , você também pode considerar usar um subshell:

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

Como a alteração do diretório ocorre no subshell, você não alterará os diretórios no seu shell interativo.

    
por 16.06.2011 / 18:05
9

Outra alternativa que é útil, se você vai fazer vários comandos no diretório, é isto:

pushd /path/to
mv oldfile newfile
...
popd
    
por 16.06.2011 / 16:57
5

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

    
por 16.06.2011 / 16:51

Tags