Existe uma maneira inteligente de copiar e mover operações ou um comando para duplicar um arquivo, sem ter que fazer um cd
e mv
depois na mesma pasta?
Por exemplo, eu tenho que executar o seguinte:
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Observe que o diretório para onde estou movendo o arquivo é o mesmo, mas tenho que colocar todo o caminho novamente e às vezes fica irritante. Estou curioso para saber se existe outra maneira de fazer isso sem ter que colocar o caminho inteiro novamente , porque a operação seria feita no mesmo caminho.
Respostas:
Basta usar a expansão de chaves :
Isso é equivalente a escrever:
A expansão de chaves permite fornecer mais argumentos, é claro. Você pode até passar intervalos para que, por exemplo, para criar um par de pastas de teste, você pode executar
mkdir test_{a..z}
, e começando com Bash 4, você pode criar seqüências com zeros à esquerda, bem como, como emtouch foo{0001..3}
, o que criafoo0001
,foo0002
efoo0003
. O Bash Hackers Wiki tem um artigo com alguns exemplos para você.Se você precisar usar dois comandos diferentes, use um subshell e
cd
, primeiro, como na resposta de @ Ignacio .fonte
brace
expansão, obrigado!meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
/bin/bash
, e não está em um script que possui/bin/sh
o shebang ou algum outro shell que não suporta expansão de chaves? Se você executarset
, o seuSHELLOPTS
contémbraceexpand
?file.txt,
efile2.txt
.mv /folder1/folder2/folder3/file{,-2013}.txt
Execute a operação em um subshell.
A alteração do diretório de trabalho não será propagada para o shell pai.
fonte
ash
,dash
,ksh88
Para não mencionar o antigo shell Bourne são exemplo de conchas não apoiá-lo.Se você quiser inteligência, aqui está a expansão do histórico do bash
Eu não usaria isso sozinho, pois acho impossível memorizar. Ocasionalmente, uso o equivalente ao vim , mas tenho que procurá-lo quase todas as vezes.
fonte
Você pode definir uma variável. Claro que isso tem o efeito colateral de deixar as variáveis por aí.
fonte
(D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)
ou simplesmente adicionando umunset
comando no final. (Adicionei aspas como uma “melhor prática”; se você costuma usar aspas, não precisará parar e coçar a cabeça quando aparecer um nome de caminho que contenha caracteres especiais.)cd
do que definir uma variável. Não é muito mais fácil, eu admito.Eu gosto das outras soluções, mas aqui está outra, implementada como um script com matrizes bash, pushd, popd:
fonte
Slhck responde diretamente à pergunta da maneira mais simples possível, mas Valter também gosta da resposta de autopop, então aqui está uma que segue a mesma linha;
fonte