Como renomear em lote arquivos usando o bash

0

Eu sei que há muitas dessas perguntas, mas não consegui encontrar uma (ou uma combinação de várias), que descreve as coisas que quero fazer. Acho que preciso usar expressões regulares, mas não sou muito bom com isso. Eu uso zsh. Eu tenho uma pasta com arquivos, que eu quero renomear:

  • Eu quero que os arquivos challenge1.rb , challenge2.rb , challenge3.rb , etc. sejam renomeados para c1.rb , c2.rb etc. Similarmente task1.rb e similares devem ser renomeados para t1.rb etc.

  • sample_spec_c1.rb , sample_spec_c2.rb etc. devem ser renomeados para c1_spec.rb , c2_spec.rb etc.

Então, acho que preciso de uma combinação de expressões regulares e iteração, mas não sei como escrever o script bash.

    
por Alex Popov 05.11.2013 / 09:38

1 resposta

2

Aqui está um pequeno script que fará o que você quiser. Você pode chamar o script com uma lista de arquivos como: ./scriptname *.rb ou com diretórios (ele os reciclará): ./scriptname .

Não se esqueça de definir o bit executável: chmod a+x scriptname .

#!/bin/sh

suff=rb     # suffix of files to rename

script="$0" # this script name for recursion

for f in "$@" ; do
    if test -d "$f" ; then
        echo "=== recursing directory $f"
        find "$f" -type f -name "*.$suff" -exec "$script" {} +
    elif test -f "$f" ; then
        d="$(dirname "$f")"
        b="$(basename "$f")"
        r="$(echo "$b" | sed -r "s/^([a-zA-Z])[a-zA-Z]*([0-9]+\.${suff})\$//;s/^[a-zA-Z]+_([a-zA-Z]+)_([a-zA-Z]+[0-9]+)(\.${suff})\$/_/")"
        echo "-- renaming $f -> $d/$r"
        mv "$f" "$d/$r"
    fi
done
    
por 05.11.2013 / 11:13