O exercício "Copiar especial" acompanha o material de comandos externos e do sistema de arquivos na seção Utilitários do Python. Este exercício está no diretório "copyspecial" em google-python-exercises. Faça o download de google-python-exercises.zip se ainda não tiver feito isso. Consulte Configuração para mais detalhes. Adicione seu código em copyspecial.py.
O programa copyspecial.py aceita um ou mais diretórios como argumentos. Diremos que um arquivo "especial" é aquele em que o nome contém o padrão __w__ em algum lugar, em que w é um ou mais caracteres de palavras. O main() fornecido inclui código para analisar os argumentos da linha de comando, mas o restante é com você. Escreva funções para implementar os recursos abaixo e modifique main() para chamar suas funções.
Funções sugeridas para sua solução(detalhes abaixo):
- get_special_paths(dir) -- retorna uma lista de caminhos absolutos dos arquivos especiais no diretório especificado
- copy_to(paths, dir) com base em uma lista de caminhos, copia esses arquivos para o diretório especificado
- zip_to(paths, zippath) com uma lista de caminhos, compacte esses arquivos no ZIP fornecido
Parte A (manipular caminhos de arquivos)
Reúna uma lista dos caminhos absolutos dos arquivos especiais em todos os diretórios. No caso mais simples, basta exibir essa lista (aqui, o "." após o comando é um único argumento indicando o diretório atual). Mostre um caminho absoluto por linha.
$ ./copyspecial.py . /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
Presumimos que os nomes não estão repetidos nos diretórios (opcional: verifique essa suposição e gere um erro se for violada).
Parte B (cópia de arquivos)
Se a opção "--todir dir" estiver presente no início da linha de comando, não imprima nada. Em vez disso, copie os arquivos no diretório fornecido, criando-o se necessário. Use o módulo Python "shutil" para copiar o arquivo.
$ ./copyspecial.py --todir /tmp/fooby . $ ls /tmp/fooby xyz__hello__.txt zz__something__.jpg
Parte C (chamar um programa externo)
Se a opção "--tozip zipfile" estiver presente no início da linha de comando, execute este comando: "zip -j zipfile <listar todos os arquivos>". Isso vai criar um arquivo ZIP com os arquivos. Só por diversão e segurança, mostre também a linha de comando que você vai fazer primeiro (como mostrado na aula). Observação sobre o Windows: por padrão, o Windows não vem com um programa para produzir arquivos ZIP padrão, mas é possível fazer o download do programa ZIP sem custo financeiro e aberto em www.info-zip.org.
Para usuários de Linux, se zip
não estiver instalado, será possível instalá-lo chamando sudo apt install zip
.
$ ./copyspecial.py --tozip tmp.zip .Command I'm going to do:zip -j tmp.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
Se o processo filho for encerrado com um código de erro, saia com um código de erro e imprima a saída do comando. Para testar, tente gravar um arquivo ZIP em um diretório que não existe.
$ ./copyspecial.py --tozip /no/way.zip .Command I'm going to do:zip -j /no/way.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
zip I/O error: No such file or directory zip error: Could not create output file (/no/way.zip)