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

12

Ocasionalmente, editei algum arquivo e quero movê-lo para uma pasta diferente. (Normalmente: em uma pasta do Dropbox, onde eu não queria trabalhar para evitar atualizações constantes aos outros proprietários da pasta.) Faço isso, por exemplo, com

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

Posteriormente, muitas vezes me vejo desejando alterar o diretório para o diretório de destino da minha operação de movimentação anterior. Encontro-me pressionando a seta para cima, excluindo a final file.pdf, mantendo a esquerda, excluindo mv file.pdfe substituindo-a 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?

Mees de Vries
fonte
1
se você segurar CTRL + Esquerda, ele vai ir para a esquerda pela palavra que é mais rápido
gato
Comentário lateral, não uma resposta à sua pergunta do shell: normalmente apenas pausei o Dropbox durante a edição. Ele também garante que nenhum outro arquivo seja alterado "sob meus pés".
Constantino Tsarouhas 03/03

Respostas:

17

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

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

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

Após o designador opcional de palavras, você pode adicionar uma sequência de um ou mais 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 o zsh.

muru
fonte
1
Isso é tão legal.
Elder Geek
4

Se você não está alterando o nome do arquivo, você pode omiti-lo e o mv o adicionará 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 último argumento, você pode usar !!:$ou !$como a resposta de muru descreve.
Se você estiver usando o bash com os padrões usuais, poderá usar Alt+ ..
(Este é o insert-last-argumentcomando readline ; bind -plistará todas as suas ligações atuais.)

deltab
fonte
1
nota que omitir o nome do arquivo de destino pode silenciosamente substituir o arquivo de destino se ele já existis
cat
mvsempre substitui os arquivos de destino silenciosamente, a menos que você especifique as opções -i/ --interactiveou -n/ --no-clobber. É por isso que tenho alias mv='mv -i' cp='cp -i'no meu .bashrc.
David Foerster
-1

Outra abordagem é criar seu próprio comando dedicado para esse fim. Isso pode ser feito através de uma função que pode se parecer com:

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

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

De acordo com esta resposta, a função pode se parecer com:

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

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

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 nisso - para ambas as variantes - o segundo argumento ( $2) deve terminar com o nome do arquivo ou barra ( /).

Para ser nosso novo comando disponível permanentemente, 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 $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

ou:

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

insira a descrição da imagem aqui


O comando personalizado pode ser feito e por meio de um arquivo de script executável, que é colocado dentro ~/binou dentro de /usr/sbin: Como criar um comando de terminal personalizado (para executar um script)? Mas, para ser sincero, tive um problema com o comportamento cddesse cenário.

pa4080
fonte