arquivos cp ou mv no mesmo diretório em que eles já estão quando estou em outro?


12

Se eu estiver dentro ~/blobe tiver um arquivo~/blob/a_long_directory_name/c/x.x

eu posso digitar

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Existe algum atalho pelo qual eu possa digitar algo mais curto que use o caminho do diretório no primeiro parâmetro (embora não seja o meu diretório atual), por exemplo

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

onde algo como $same_dirapontaria para o dir do param 1

Respostas:


8

Para minimizar a quantidade de digitação, é provavelmente mais fácil fazê-lo em duas etapas. CD para o diretório e mova-o.

Se você tiver apenas um comando, poderá usar um subshell:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Isso significa cdque apenas entrará em vigor no subshell, mvapenas acontecerá se cdfor bem - sucedido e o diretório de trabalho do seu shell atual não será alterado.

Se você tiver mais de um comando, use a pilha de diretórios.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd

Isso não aborda o even_morecaminho relativo ... #
— 5133 Useless

Está correto. O exemplo de $ same_dir parecia ignorá-lo também.
— Alan Shutko

+1 eu gosto. Muito fácil de lembrar e fazer e que é fundamental para mim
— Michael Durrant

Interessante, pois não faz o que você pediu. Talvez sua pergunta não seja exatamente o que você pretendia?
— Useless

Inútil, atualizei meu título para esclarecer que se trata de arquivos cp / mv e mantê-los no mesmo diretório, mesmo que eu esteja em outro. btw seu nome de usuário é bonito, mas faz comentários parecem bobos quando usado neles :)
— Michael Durrant


5

Você pode usar os recursos de substituição de texto do seu shell. Em bash, você poderia usar um animal como:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Para dividir:

!# é a linha atual digitada até agora

:$pede para escolher a última palavra (substitua por um número npara selecionar a n'palavra) da string em consideração (!# neste caso). A última palavra da linha digitada até agora seria a palavra anterior.

:gs^xx^yyfaz a gsubstituição textual global ( ) ( s) na palavra resultante, substituindo 'xx' por 'yy'. ^é apenas um delimitador para o scomando permitir o uso /em seus padrões.

Esse método é um pouco mais geral, pois permite substituir qualquer parte do caminho ('xx') por qualquer outra palavra ('yy').

Finalmente, como em qualquer manipulação de histórico, é bom ter as opções de shell apropriadas definidas (por exemplo, in ~/.bashrc). Nesse caso

shopt -s histverify

exibirá a linha editada depois que você pressionar retornar, para que você ainda possa editá-la e verificar se há erros.

Por que você usaria uma construção como essa, não tenho certeza, mas funciona neste caso.


a) Excesso de ruído na linha (comparado a uma elegante expansão de braçadeira) b) Não resolve o problema do OP: eles querem substituir c/x.xpor evenmore/y.ymanter o prefixo do caminho original.
— Joseph R.

Seu segundo comentário foi uma omissão simples da minha parte, que exigiu uma edição simples para corrigir. Não vejo como essa resposta mereceu voto negativo. Com a edição (tecnicidade), ele resolve o problema e é mais geral, pois permite trocar qualquer parte do caminho (eu costumava usar algo semelhante $PWD). Claro, talvez não seja o mais elegante, mas aponta para o fato de que o shell possui substituições de texto e designadores de palavras, que alguns usuários ainda podem achar úteis para pesquisar.
— Wojtek 05/09

ESTÁ BEM. Eu estou corrigido.
— Joseph R.
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.