Parece que você pensou que mv id_rsa *.old
moveria id_rsa
para id_rsa.old
, com o *
substituído pelo primeiro argumento, mas esse não é o caso. Os curingas são expandidos pelo shell, não pelo comando. No momento em que mv
vê o comando, o shell expandiu o curinga. Existem quatro casos:
- O padrão de curinga não corresponde a nenhum arquivo. Com a maioria dos shells, isso deixa o padrão de caractere curinga não expandido e, portanto,
mv
é chamado com os argumentos id_rsa
e *.old
. Em seguida, ele move id_rsa
para um arquivo chamado *.old
(com o asterisco sendo o primeiro caractere do nome do arquivo). Alguns shells (dependendo de sua configuração) exibirão um erro e não executarão o comando nesse caso.
- O padrão de curinga corresponde exatamente a um arquivo que não é um diretório. Nesse caso, o shell substitui o padrão pelo nome do arquivo correspondente. Assim,
mv
move id_rsa
para esse arquivo correspondente, sobrescrevendo o arquivo anterior. Foi o que aconteceu no seu caso: mv
foi invocado com os argumentos id_rsa
e known_hosts.old
, para known_hosts.old
foi sobrescrito.
- O padrão de curinga corresponde a dois ou mais arquivos e o último (em ordem lexicográfica) não é um diretório. Nesse caso,
mv
reclama, porque todos os arquivos, exceto o último, são arquivos de origem e não faz sentido mover vários arquivos para o mesmo arquivo.
- O padrão de curinga corresponde a um ou mais arquivos e a última correspondência (em ordem lexicográfica) é um diretório. O arquivo de origem é movido para esse diretório. Se já houver um arquivo com o mesmo nome, ele será sobrescrito. Se o padrão tiver mais de uma correspondência, isso também se aplica a todos os arquivos correspondentes ao padrão, exceto à última, pois
mv
os vê como arquivos de origem.
Para evitar que mv
substitua inesperadamente os arquivos de destino, solicite confirmação. Coloque isso na inicialização do seu shell (por exemplo, .bashrc
):
alias cp='cp -i'
alias mv='mv -i'
Para renomear um arquivo com base no nome existente, mv
alone não ajuda. Você precisa usar outra ferramenta ou organizar para fornecer mv
com o nome completo do destino. Uma maneira de fazer o que você estava tentando fazer é com a expansão de chaves , que permite especificar palavras com um radical comum.
mv id_rsa{,.old}
O shell expande isso para mv
com os argumentos id_rsa
( id_rsa
concatenado com a string vazia) e id_rsa.old
( id_rsa
concatenado com .old
).
Para renomear arquivos em massa de acordo com os padrões, as ferramentas mais comuns são zmv
(somente zsh), prename
e mmv
. Para renomear todos os arquivos do formulário de id_SOMETHING
para id_SOMETHING.old
, você pode usar
zmv 'id_*' '$f.old'
mmv 'id_*' 'id_#1.old'
prename 's/$//' id_*