com mv, considere o caminho / nome do arquivo original ao escolher o destino [duplicado]

5

Digamos que eu precise mover o arquivo /etc/dir1/dir2/dir3/a.out para /etc/dir1/dir2/dir3/b.out

Digitar o caminho inteiro duas vezes é tedioso e ir ao diretório pode não ser o ideal. Existe uma maneira de fazer isso sem redigitar o diretório?

Em uma questão relacionada (que eu suspeito que tenha a mesma solução). Digamos que eu queira mover um arquivo someverybigfilename.png para somereallybigfilename.png . Existe uma maneira de conseguir isso sem redigitar o nome?

(Eu sei que posso usar um script. Mas o mv suporta algo assim nativamente?)

Resumindo: como posso usar o recurso mover para alterar parcialmente / alterar apenas uma parte do nome do arquivo? Como fazer uma pequena mudança como extensão?

    
por josinalvo 22.03.2017 / 18:35

4 respostas

12

No primeiro caso, se você estiver usando bash , poderá usar o aparelho expansão :

mv /etc/dir1/dir2/dir3/{a.out,b.out} 

ou até mesmo

mv /etc/dir1/dir2/dir3/{a,b}.out

No segundo caso, você pode usar a expansão de chaves novamente:

mv some{very,really}bigfilename.png

Ou (embora não economize muita digitação) você pode usar o histórico do Bash expansão da seguinte forma:

$ mv someverybigfilename.png !#$:s/very/really
mv someverybigfilename.png somereallybigfilename.png
    
por steeldriver 22.03.2017 / 19:10
2

ou

cd /etc/dir1/dir2/dir3/
mv a.out b.out

ou

crie um script como

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"

mv $dir_Path\a.out $dir_Path\b.out

exit

e para renomear:

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"
name_part="bigfile.png"
cd $dir_Path
mv some$name_part somereally$name_part

exit
    
por DarkPhoenix6 22.03.2017 / 18:46
2

Se o caminho for o mesmo, não vejo o motivo de não entrar na pasta.

Você pode salvar o caminho com o pushd ou voltar com o cd -

Exemplo:

luca@elite:~$ pushd dir1/dir2/dir3/
~/tmp/dir1/dir2/dir3 ~/tmp
luca@elite:~/dir1/dir2/dir3$ mv a.out b.out
luca@elite:~/dir1/dir2/dir3$ popd
~/tmp
luca@elite:~$ 

ou

luca@elite:~$ cd dir1/dir2/dir3/
luca@elite:~/dir1/dir2/dir3$ mv b.out a.out
luca@elite:~/dir1/dir2/dir3$ cd -
luca@elite:~$ 

Sobre o nome do arquivo, a única coisa que me veio à mente é armazená-lo em uma variável.

    
por Luca Giovenzana 22.03.2017 / 18:57
1

Existem várias maneiras de abordar isso. Um poderia ser através da função definida no arquivo ~/.bashrc .

pmv(){
    mv ""/"" ""/""
}

A função pmv , então, levaria 3 argumentos. Caminho para o diretório, arquivo de origem e arquivo de destino. Por exemplo:

$ ls testdir
self_test.sh*  test.wxg
$ pmv ./testdir  test.wxg  test2.wxg                                                                                     
$ ls testdir                                                                                                             
self_test.sh*  test2.wx

Observe que nessa função nós nos associamos ao caminho do diretório e ao caminho do arquivo com barra, assim, quando o caminho para o diretório é dado como argumento da linha de comando, não deve haver uma barra final no final. Podemos, no entanto, melhorar a definição da função usando a expansão de parâmetro do bash , que nos permitirá usar /path/to/dir ou /path/to/dir/ :

pmv(){
    mv "${1%/}"/"" "${1%/}"/""
}
  

Em uma questão relacionada (que eu suspeito que tenha a mesma solução). Digamos que eu queira mover um arquivo someverybigfilename.png para somereallybigfilename.png. Existe uma maneira de conseguir isso sem redigitar o nome?

Efetivamente, não, não há como fazer isso com mv sozinho. Até mesmo as soluções steeldriver e mine para a primeira parte da sua pergunta fazem uso dos recursos de bash , não de mv . Manipulações de renomeação mais avançadas, como no seu caso inserir texto em filename, devem ser feitas com prename , onde você usa expressões regulares perl para renomear arquivos dinamicamente.

$ touch someverybigfilename.png

$ prename 's/very/really/' someverybigfilename.png                                                                       

$ ls somereallybigfilename.png                                                                                           
somereallybigfilename.png
    
por Sergiy Kolodyazhnyy 22.03.2017 / 20:17