Substituição de variáveis de globalização bash? [duplicado]

0

Eu quero renomear os arquivos usando o nome existente deles como base para o novo nome.

Então, se eu puder ls desses arquivos com

ls blue*+(.png)

Eu gostaria de renomeá-los como

mv blue$(*)+(.png) $(1).png

exceto que não funciona obviamente. Existe sintaxe para esse tipo de variáveis no bash globbing ou há uma maneira mais fácil?

    
por user1561108 26.11.2012 / 21:07

4 respostas

2

A maneira portátil de fazer isso é

for f in blue*.png; do mv -- "$f" "${f#blue}"; done

Tudo isso requer é mv e funciona não apenas em bash , mas também em qualquer shell compatível com POSIX que suporte expansão do parâmetro padrão POSIX . Não é necessário que seu sistema tenha zsh ou uma versão específica de rename instalada.

    
por 26.11.2012 / 22:11
0

Eu não vejo nenhuma maneira fácil de fazer isso no bash, mas é claro que você pode dividir o problema em várias etapas, como cortar o prefixo, lembrar da extensão e depois substituir as várias instâncias da extensão por uma única. / p>

for file in blue*+(.png); do tmp="${file#blue}"; extension="${file##*.}"; echo "$file" "${tmp/%+(.$extension)/}.$extension";done

se você está feliz com os resultados, basta digitar ...

^echo^mv

e toda a magia vai acontecer. :)

    
por 26.11.2012 / 22:14
0

Com bash:

zsh -c '
  autoload -U zmv
  zmv "blue(*).png" "\.png"'

;-). Ou, mais seriamente, você verá que o zmv do zsh é uma ferramenta muito poderosa para todos os tipos de renomeação de trabalhos. Ao contrário dos scripts que você pode criar, essa ferramenta (ou qualquer outra ferramenta dedicada para a tarefa como mmv ou renomear) toma muito cuidado para não estragar arquivos e é mais provável que seja mais robusta em casos de canto.

    
por 26.11.2012 / 21:29
0

No Debian e nos derivados (incluindo o Ubuntu), existe um comando rename que pode fazer o que você quer:

rename -n "s/\+\.png/.png/" blue*+.png

Remova o sinalizador -n depois de testar para realmente aplicar a renomeação.

Este comando rename é um script Perl, não deve ser confundido com o comando rename da suíte util-linux. Outras distribuições podem fornecer como prename ou rename.pl ou não.

    
por 26.11.2012 / 21:11