Tenho centenas de diretórios, alguns aninhados em outros diretórios, com dezenas de milhares de arquivos. Os arquivos precisam ter um carimbo de data/hora removido deles.
Um exemplo de nome de arquivo é Letter to Client 27May2016~20160531-162719.pdf
e eu gostaria que ele voltasse a serLetter to Client 27May2016.pdf
Outro nome de arquivo de exemplo é ABCDEF~20160531-162719
e eu gostaria que ele voltasse a ser ABCDEF
. Observe que este arquivo não possui extensão, diferente do exemplo acima.
Eu preciso de um comando que eu possa executar na raiz das pastas afetadas que irão percorrer recursivamente e encontrar/corrigir os nomes dos arquivos.
(Eu uso o Syncthing para sincronizar arquivos e restaurei os arquivos excluídos copiando-os do .stversions
diretório de volta para onde estavam, mas descobri que o Syncthing acrescenta esse carimbo de data/hora...)
rename
Conheça a ferramenta Perl :( página do manual online , veja também este Q )
Essa regex diz para corresponder a um til, como muitos caracteres que não são pontos, mas pelo menos um; e para substituir o que corresponder a uma string vazia. Remova o
-n
para realmente fazer a substituição. Poderíamos mudar o padrão~[-0-9]+
para apenas substituir dígitos e traços.Desculpe, você disse "recursivamente", então vamos usar
find
:Ou apenas com Bash ou ksh, embora os diretórios
~
seguidos por dígitos quebrem isso:Novamente, remova o
echo
para realmente fazer a renomeação.Em bash:
Isso localiza todos os nomes de arquivo (recursivamente) que correspondem ao padrão de data (seguindo um til) e, em seguida, repete um
mv
comando de amostra para renomeá-los. O destino do comando mv é o resultado de uma expansão de parâmetro bash que substitui qualquer texto til-datestring por nada.Código:
Os comandos acima alcançam o resultado mencionado