No Linux, às vezes, renomeio arquivos como este:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Observe que eu quero apenas renomear o arquivo, não movê-lo para outro diretório.
Existe um comando que me permita executar uma versão abreviada desse comando? Estou pensando em algo como:
mv dir1/dir2/dir3/file.txt file.txt.old
ou talvez até algo como (para adicionar apenas ao nome):
mv dir1/dir2/dir3/file.txt {}.old
Meu objetivo não é ter que especificar o caminho completo novamente.
Sei que esses "exemplos" que escrevi não funcionam, mas é apenas uma idéia do que quero realizar.
Eu não quero ter que entrar no diretório.
linux
filesystems
files
mv
santiago arizti
fonte
fonte
(cd dir1/dir2/dir3 && exec mv file.txt{,.old})
tem efetivamente o mesmo desempenho que o código sem o subprocesso, porque issoexec
evitafork()
a chamada de comando externo; portanto, você tem exatamente uma bifurcação de qualquer maneira.Respostas:
para um único arquivo, tente
para onde a
X{a,b}
construção se expandeXa Xb
, você pode ter uma visualização usandopara ver se ele se encaixa na sua necessidade.
Nota:
isso para vários arquivos
é improvável que se expanda para o que você deseja. (isso será expandido para uma mistura de file.txt file1.txt.old file2.txt ...)
{txt,txt.old}
pode ser limitado a{,.old}
como por comentáriose o nome do diretório não for ambíguo, o curinga poderá ser usado.
para uso de vários arquivos
rename
solte
-n
para ter renomeação efetiva.fonte
mv dir1/dir2/dir3/file.txt{,.old}
também não funcionam, e ser ainda mais curto?O comando
rename
renomeia todos os arquivos correspondentes. Seu principal objetivo é renomear vários arquivos, mas se a expressão Perl corresponder a apenas um arquivo, renomeará apenas esse único arquivo. Para obter detalhes e sintaxe específica distro por favor leia a página de manual:man rename
.Exemplo de uso: renomeie "/path/file.txt" para "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Notação mais curta (graças a shalomb):
Para uso a seco
rename -n
.Mais exemplos e detalhes podem ser encontrados em https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
fonte
rename
comandos diferentes com um comportamento completamente diferente..old
ao nome do arquivo, provavelmente é um pouco mais conveniente fazer umrename 's/$/.old/' /path/to/file.txt
ourename '$_.=".old"' /path/to/file.txt
Para um caso pontual, se eu não quiser alterar meu diretório atual, posso apenas usar um sub-shell:
Como você está
cd
dentro do sub-shell, não alterou seu diretório no seu shell realfonte
&& exec mv
- dessa forma, você não tenta renomear secd
falhar e oexec
consome o subshell, evitando assim uma penalidade no desempenho.&&
Para um caso pontual, como eu disse, não me preocuparia com o custo do sub-shell (mantenha-o simples: ser capaz de lembrar facilmente como fazê-lo é mais importante da IMO)Gosto da solução da @ archemar de usar a expansão {}, porque você pode usá-la quando já tiver iniciado sua linha de comando. Aqui estão algumas outras possibilidades de completude:
(aspas são necessárias apenas se você tiver espaços ou outros caracteres de quebra de palavras no nome)
Notas:
mymv
pode ser qualquer string razoável, usei mymv para "minha jogada".Outro:
mas
(de @Adam e @CharlesDuffy) é sem dúvida melhor no caso de o CD falhar.
fonte
mmv
, já existe um programa chamado dessa maneira.Se você deseja entrar no subdiretório para diminuir o
mv
comando, mas deseja retornar ao diretório atual posteriormente, há duas maneiras de fazer isso. Uma é colocar ocd
emv
em um subshell (como já foi sugerido).O outro é usar
pushd
epopd
alterar diretórios:O
pushd
comando é comocd
, exceto que ele primeiro coloca o nome do diretório atual em uma pilha.popd
remove o nome do topo da pilha e muda para esse diretório.fonte
pushd
epopd
são extensões destinadas ao uso interativo - o POSIX as lista explicitamente como "os resultados não são especificados" e um shell criado para a execução de scripts (por exemplo, em um ambiente incorporado mínimo) não precisa de suporte.Eu apenas faria
fonte
A solução envolvendo:
mv something{.txt,.txt.old}
está usando um "basismo". Se você deseja uma maneira mais portátil, usando manipulações de variáveis comuns:fonte
${var/text/replacement}
é um próprio basismo.