altera a extensão de todos os arquivos com base na entrada do usuário

0

Eu estava fazendo uma avaliação on-line e recebi a pergunta abaixo.

  • Crie um script localizado em /usr/local/bin/set-file-extensions que alterará a extensão de todos os arquivos no diretório /var/dump/files com base na entrada do usuário.
  • O script deve suportar a opção sinalizador -E que permitirá que um usuário passe uma extensão de três caracteres (.i.e log ).
  • Se uma extensão de três caracteres não for passada pelo usuário, exiba o erro " inválida. É necessária uma extensão de três caracteres. " e saia com um código de status de 19.
  • Quando essa extensão de arquivo for recebida, o script deverá renomear todos os arquivos no diretório /var/dump/files com a extensão fornecida. Ou seja Um arquivo chamado myfile deve ser renomeado como myfile.log .
por Ramesh 20.08.2014 / 21:01

2 respostas

1

Você não especificou que tinha que ser uma solução bash, então aqui está uma solução python. Leva em conta que você precisa de uma extensão de 3 caracteres. No entanto, não faz muito no sentido de verificar você não vai quebrar nada. Ele verifica os diretórios e você só renomeia os arquivos reais. Essa solução exigirá que uma opção -E seja passada.

editar:

Se o nome do arquivo começar com a. (arquivo oculto) ignore. Com relação aos links simbólicos, isso pode levar um pouco mais de consideração.

#!/usr/bin/env python

import sys
import argparse
import re
import os

def main():
    path = '/var/dump/files'
    parser = argparse.ArgumentParser()
    parser.add_argument('-E', help='three character extension(.i.e log)',\
         type=str)
    args = parser.parse_args()

    if args.E:
        if not re.search(r'^[a-zA-Z]{3}$', args.E):
            print 'Invalid Input. A three character extenstion required: %s' % str(args.E)
            sys.exit(19)
        ext = '.'+str(args.E)
    else:
        print 'Invalid Input. A three character extenstion required'
        sys.exit(19)

    files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f))]
    for f in files:
        # ignore hidden files
        if f[0] == '.': continue
        name = f.split('.')[0]
        os.rename(os.path.join(path,f),os.path.join(path,name+ext))



if __name__ == "__main__":
    main()

Esta solução do -E será opção, e usará '.log' como padrão. Você poderia especificar Required = True no add_argument () para tê-lo como uma opção obrigatória.

#!/usr/bin/env python

import sys
import argparse
import re
import os

def main():
    path = '/var/dump/files'
    parser = argparse.ArgumentParser()
    parser.add_argument('-E', help='three character extension(.i.e log)',\
         type=str)
    args = parser.parse_args()

    if args.E:
        if not re.search(r'^[a-zA-Z]{3}$', args.E):
            print 'Invalid Input. A three character extenstion required: %s' % str(args.E)
            sys.exit(19)
        ext = '.'+str(args.E)
    else:
        ext = '.log'

    files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f))]
    for f in files:
        # ignore hidden files
        if f[0] == '.': continue
        name = f.split('.')[0]
        os.rename(os.path.join(path,f),os.path.join(path,name+ext))



if __name__ == "__main__":
    main()
    
por 21.08.2014 / 11:09
0

Acabei criando um script como abaixo.

#!/bin/bash
while [[ $# -ge 1 ]]
do
    key="$1"
    shift
    case $key in
    -E)
        EXTENSION="$1"
        length=$(expr length "$EXTENSION")
        if [ $length != 3 ]
        then
            (exit 19); echo "Invalid Input. A three character 
            extension is required. Exit status:$?"
        else
            for f in /var/dump/files/*; do
                mv -- "$f" "${f}.$EXTENSION"
            done
        fi
        shift
    ;;
    *)
        (exit 19); echo "Invalid Option selected. Exit status:$?"
    ;;
    esac
done

Referências

link

    
por 20.08.2014 / 21:01

Tags