cg_ext - script para alteração de extensão de arquivos em larga escala

Publicado por Tairan Andreo (última atualização em 28/02/2019)

[ Hits: 1.544 ]

Download cg_ext.sh




Script simples para realizar a troca de extensão de vários arquivos em um diretório. O programa está estável (pelos testes que realizei), mas aceito qualquer dica para a melhora do código ou para acrescentar novas funcionalidades.

Por padrão o script altera somente a extensão dos arquivos na pasta raiz informada e não nos seus subdiretórios. Caso necessário que a alteração também seja realizada para os subdiretórios (recursividade), a opção "-r" pode ser utilizada. Também existe a possibilidade de definir com mais precisão a profundidade máxima em relação ao nível que o script será aplicado nos diretórios. Essa funcionalidade é definida com a opção -maxdepth NUM, onde NUM deve ser um número inteiro não negativo.

Escrevi o script com meu inglês macarrônico mais como treino do que qualquer coisa, então se sentirem a necessidade posso alterar os comentários e a página de ajuda e deixar tudo em português.

Qualquer dúvida só chamar.

  



Esconder código-fonte

#!/bin/bash
#
# cg_ext.sh
# Author: Tairan Andreo
# Git: github.com/taandreo/
#
# This program is a script to change the file extension on a large scale.
#
# Version 1.0: Added support for options -V | --version and -h --help.
# Version 2.0: Added support for option -v | --verbose.
# Version 3.0: Added support for -i and -o options. 
# Version 4.0: Added support for -r and -maxdepth options. 

NAME=$(basename "$0")       # Program name

# Flags:

VERBOSE=0
MAX_DEPTH=1
RECURSIVE=0

HELP="Usage: $NAME [OPTIONS] -i .ext -o .ext2 DIRECTORY

OPTIONS:

    -i              Original extension.
    -o              Final extension.

    -h, --help      Print this help summary page.
    -V, --version   Print the version.
    -v              Enable Verbose.

    -maxdepth       Define de max depth.
    -r              Enable recursive mode.

EXAMPLES:
    
    $NAME -i .txt -o .csv .                Change the extension .txt to .csv for all files in this directory.
    $NAME -i .txt -o .csv . -v             Change the extension .txt to .csv all files in this directory and show each altered file.
    $NAME -i .txt -o .csv /home/user -r    Change the extension .txt to .csv for all files starting in /home/user and each subdirectory. 
"

is_ext(){
    # Create a regex which only matches 
    regex='^\.[[:alnum:]][.[:alnum:]]*'
    if !([[ "$1" =~ $regex ]])
    then
        echo "Invalid Argument: \"$1\"."
        echo "The argument must be a filename extension."
        exit 1
    fi
}

test_options(){
    if !(test -n "$1")
    then
        echo "-i option required."
    fi

    if !(test -n "$2")
    then
        echo "-o option required."
    fi

    if !(test -n "$3")
    then
        echo "Missing directory operand."
    fi
    
    if !(test -n "$1" & test -n "$2" & test -n "$3")
    then
        exit 1
    fi
}

if !(test -n "$1")
then 
    echo "$HELP"
    exit 0
fi

while test -n "$1"
do
    case "$1" in

        -h | --help)
            echo "$HELP"
            exit 0
        ;;

        -V | --version)
            echo -n $NAME
            egrep '^# Version' "$0" | tail -1 | cut -d : -f 1 | tr -d \# # Extract the version from the reader
            exit 0
        ;;
        
        -v)
            VERBOSE=1
        ;;
        
        -i)
            shift
            is_ext "$1" # Checks if the passed argument is a filename extension.  
            INPUT_EXT=$1
        ;;
        
        -o)
            shift
            is_ext "$1" # Checks if the passed argument is a filename extension.
            OUTPUT_EXT=$1
        ;;

        -maxdepth)
            shift
            MAX_DEPTH=$1
        ;;
        
        -r)
            RECURSIVE=1
        ;;
            

        *)  
            if test -d "$1"
            then
                DIRECTORY="$1"
            else
                echo "Invalid option: $1"
                exit 1
            fi
        ;;
    esac
    shift
done


test_options $INPUT_EXT $OUTPUT_EXT $DIRECTORY

if test $RECURSIVE = 1
then
    find  $DIRECTORY -regex "^.*\\$INPUT_EXT\$" > cache_find
else
    find  $DIRECTORY -maxdepth $MAX_DEPTH -regex "^.*\\$INPUT_EXT\$" > cache_find
fi

while read f
do
    if test $VERBOSE = 1
    then
        echo $f
    fi
    mv -- "$f" "${f%$INPUT_EXT}$OUTPUT_EXT"
done < cache_find

rm -f cache_find

Scripts recomendados

Conversor de log SVN para RSS

Conversor do VMware para o VirtualBox

Bloqueando o acesso à internet

Criar políticas para o SELinux

FingerPrint


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts