Como posso gerar um novo nome para um arquivo se houver um arquivo existente com o mesmo nome? Em um ambiente de área de trabalho, um novo nome é gerado, acrescentando um número ao final do nome do arquivo, mas como isso pode ser feito na linha de comando?
Estou usando o sistema operacional Android com o Busybox.
mktemp
?mktemp
não funcionará.Respostas:
Supondo que você tenha um shell POSIX, você pode fazer isso:
Como usar isso
Esta é uma função, então salve-a no seu
~/.bashrc
e chame-a como faria normalmentemv
.O que isso faz
mv
executável original naMV
variávelDEST
DEST
existir e não for um diretório, essa função assume que sua renomeação está tentando bloquear um arquivo.
, que marca a extensão), a extensão (qualquer coisa após a final.
), a contagem (se houver; qualquer coisa no prefixo após a final-
).mv a.txt b.txt
, primeiro tentarámv a.txt b-001.txt
. Essa próximamv
chamada também deve ser a própria função, porque, seb-001.txt
também existir, queremos continuar incrementando o contador até encontrarmos um novo nome de arquivo que não exista.mv
executável original será chamado com seus argumentos originais.Ressalvas
foo-001.txt
, ele será movido parafoo-001-001.txt
.Notas
3
naprintf
declaração para o que quiser.fonte
/tmp
é um diretório existente e chamou/bin/mv file1 /tmp
Não vejo onde está o problema.Geralmente, uso a ferramenta
mktemp
para criar arquivos temporários confiáveis. O padrão é criar arquivos, mas também pode criar diretórios por meio de sua-d
opção.Exemplo
Veja como você pode criar alguns nomes temporários para arquivos em seu diretório atual.
Isso criará os arquivos para você.
Referências
fonte
mktemp
no android, mas +1 de qualquer maneira, já que essa é uma boa resposta para uma boa pergunta, U&L./system/bin/sh
e parece sersh
compatível - construções como oif [ -w $file ]
trabalhomv
erename
estão disponíveis -, portanto, um script para fazer isso apenas com os built-ins deve funcionar lá.Aqui está uma alternativa ao script de Joseph R, que não tem nenhuma das ressalvas! Anexará um sufixo numérico a um nome de caminho (o caminho pode ser um diretório ou um arquivo), incrementando o valor do sufixo até que seja encontrado um que ainda não exista. Outros utilitários, como
logrotate
usam um padrão semelhante, mas giram todas as cópias existentes para que o novo sempre tenha '0' como sufixo. Como não é uma rotação nesse sentido, vou chamá-lodotmv
. Lembre-se de quefile.0
será a cópia mais antiga .Por exemplo:
Renomeia
somefile.txt
somefile.txt.0
, a menos que exista, caso em que serásomefile.txt.1
, e assim por diante. Você pode listar mais de um arquivo (dotmv this that "the other thing"
etc.), todos eles serão movidos por pontos.Acredito que isso seja compatível com POSIX - ele roda
set -o posix
no bash (mas esse é um teste duvidoso). Também testei com o shell do Android (Jelly Bean 4.2.1) e funciona lá. No entanto, no Android, você precisará alterar o shebang conforme indicado ou executá-losh dotmv
- o que você fará de qualquer maneira, a menos que tenha um dispositivo raiz, porque não há como tornar um script executável de outra forma. Alterar o shebang permitirá que você useexec dotmv
.Espero que a lógica aqui seja muito direta. Isso pode ser implementado em python, C ou qualquer outra linguagem processual completa com E / S de arquivo.
fonte