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_*