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

Michael Durrant
fonte

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
Alan Shutko
fonte
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
26

Com o bash, você pode usar a expansão de chaves

mv blob/a_long_directory_name/{c/x.x,evenmore/y.y}
iruvar
fonte
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.

Wojtek
fonte
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.