Removendo dígitos do início do nome de arquivo [duplicado]

1

Eu esperava que isso funcionasse:

$ find . -type f -exec basename {} \; | while EFS= read -r f; do echo "${f##[0-9]}"; done 

Mas, por exemplo, para arquivos nomeados como:

1foo
11bar

retorna:

foo
1bar

quando

foo
bar

é esperado.

PS: enfim, eu quero mv "$f" para o nome modificado (e também faço outras modificações)

EDITAR:

PS2: não é uma duplicata se você considerar PS. De qualquer forma, a resposta assinalada me satisfaz.

    
por Erwann 24.10.2018 / 22:38

2 respostas

2

find . -type f -exec basename {} \; | while IFS= read -r f; do echo "${f##+([0-9])}"; done deve fornecer os resultados desejados.

Isso usa operadores estendidos de correspondência de padrões, dos quais +() significa corresponder a um ou mais.

Informações adicionais podem ser encontradas na seção Correspondência de Padrões da página man bash.

    
por 24.10.2018 / 23:49
5

Se rename (às vezes chamado de prename ) for uma opção:

find . -name '[[:digit:]]*' -type f -exec rename 's:^(.*/)\d+([^/]*)\z::s' {} +

explicação:

  • ( ) padrões entre parênteses são salvos e podem ser recuperados pelo número de aparência
  • .*/ a parte do diretório deve ser preservada
  • ([^/]*)\z : todos os não caracteres / até o final do assunto.
  • reimprima o diretório capturado e tudo após os dígitos no nome da saída

Você pode usar a opção -n em rename para fazer uma execução a seco para verificar os resultados primeiro.

    
por 24.10.2018 / 23:56