Altera o diretório para o destino da operação de movimentação

12

Ocasionalmente, editei alguns arquivos e quero movê-los para uma pasta diferente. (Tipicamente: para uma pasta do Dropbox, onde eu não queria trabalhar para evitar que os outros donos da pasta atualizassem constantemente.) Eu faço isso, por exemplo, com

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

Depois, muitas vezes me pego querendo mudar o diretório para o diretório de destino da minha operação de movimentação anterior. Eu me vejo acertando a seta para cima, excluindo o file.pdf final, segurando para a esquerda, excluindo mv file.pdf e substituindo por cd .

Existe uma maneira mais rápida e inteligente de fazer isso? Existe um comando "mover arquivo e depois alterar o diretório para", ou um atalho para o último diretório usado, ou algo assim?

    
por Mees de Vries 02.03.2017 / 16:41

3 respostas

17

Se você estiver usando o bash, então a interação do histórico terá apenas o atalho para isso. O designador de palavras para o último argumento do comando anterior:

  

!!:$
  designa o último argumento do comando anterior. Isso pode ser   encurtado para !$ .

Combinado com um modificador para remover o último componente do nome do caminho:

Após o designador de palavras opcional, você pode adicionar uma sequência de um ou mais dos modificadores válidos , cada um precedido por um ':'.

  

h
   Remova um componente de nome de caminho à direita, deixando apenas a cabeça.

Então:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

O mesmo atalho também pode ser usado com zsh.

    
por muru 02.03.2017 / 16:48
4

Se você não está alterando o nome do arquivo, você pode omiti-lo e o mv irá adicioná-lo automaticamente; isso é especialmente útil ao mover vários arquivos:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Com o diretório como o último argumento, você pode usar !!:$ ou !$ como a resposta de muru descreve.
Se você estiver usando o bash com os padrões usuais, você pode usar Alt + . . (Esse é o comando readline insert-last-argument ; bind -p listará todas as suas ligações atuais.)

    
por deltab 02.03.2017 / 19:04
-1

Outra abordagem é criar seu próprio comando dedicado para essa finalidade. Isso pode ser feito através da função , que pode ser semelhante a:

$ function mv-special { mv  ; cd $(dirname $(echo -)); }

Onde: (1) mv-special é o nome da função; (2) as variáveis e são argumentos na função que serão usados pelos comandos mv e cd ; (3) $(echo -) adiciona um caractere de wildcat ao final da string em var e corrige o comportamento de dirname se a variável contiver somente caminho; (4) $(dirname $(echo -)) filtrará apenas o caminho de .

De acordo com esta resposta , a função poderia ser semelhante a:

$ function mv-special { mv  ; cd ${2%/*}; }

Onde: ${2%/*} filtrará apenas o caminho de .

Para estar disponível como um comando, esta função deve ser exportada :

$ export -f mv-special

Uso:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

ou:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Por favor, preste atenção a isso - para ambas as variantes - o segundo argumento ( ) deve terminar com nome de arquivo ou barra ( / ).

Para ser nosso novo comando permanentemente disponível, a definição da função e o comando de exportação devem ser anexados a ~/.bashrc :

# My custom 'mv-special' command:
function mv-special { mv  ; cd $(dirname $(echo -)); }
export -f mv-special

ou:

# My custom 'mv-special' command:
function mv-special { mv  ; cd ${2%/*}; }
export -f mv-special

Comando customizado pode ser feito e via arquivo de script executável que é colocado em ~/bin ou em /usr/sbin : Como posso criar um comando terminal personalizado (para executar um script)? Mas, para ser honesto, fui confrontado com um problemas com o comportamento de cd neste cenário.

    
por pa4080 03.03.2017 / 12:26