Manipulação de erro do Shellscript

2

Estou codificando um shell muito simples que exclui arquivos de uma determinada pasta, nesse caso todos os arquivos .csv que residem nessa pasta.

O código é assim:

#!/bin/bash
# Used to clean folder

MinVal=0
Files=$(ls -1 *.csv | wc -l)


if [ $Files -gt $MinVal ];then
        rm *.csv
        echo -e "\e[31;43m***** DONE *****\e[0m"    

 else       
        echo -e "\e[31;43mThere is no valid file to delete, please check\e[0m"      


fi

O script de shell funciona como esperado, mas quando você executa o shell e não há arquivos .csv na pasta, o terminal diz o seguinte:

ls: cannot access *.csv: No such file or directory

claro, também mostra a mensagem else :

There is no valid file to delete, please check

Existe alguma maneira de evitar o ls: cannot access *.csv: No such file or directory e ir direto para o tratamento de erro else ?

Saudações.

    
por sandatomo 08.11.2017 / 15:10

2 respostas

8

Isso acontece porque *.csv é passado textualmente para ls pelo shell, que é o comportamento padrão do POSIX. Se você quiser evitar isso, use nullglob para que as globs que retornam nada retornem nada em vez de retornar a string textual inserida. Isso tem um problema, porque ls tem um comportamento diferente quando nenhum arquivo é fornecido.

Tente isso, que tem o benefício de evitar erros no caso de novas linhas incorporadas em nomes de arquivos:

shopt -s nullglob
filenames=( *.csv )  # put all files in an array
files="${#filenames[@]}"  # get number of files
    
por 08.11.2017 / 15:15
5

Se tudo o que você deseja fazer é suprimir a mensagem de aviso de ls , o mais direto a fazer seria redirecionar stderr para /dev/null , por exemplo:

Files=$(2>/dev/null ls -1 *.csv | wc -l)

Observe que redirecionar stderr suprimirá todos erros resultantes desse comando, incluindo erros que podem não estar relacionados à ausência de *.csv arquivos no diretório.

Uma solução melhor para a contagem de arquivos pode ser usar find em vez de ls , por exemplo:

find . -maxdepth 1 -name "*.csv" | wc -l

De fato, talvez você queira usar find para realizar a exclusão também:

find . -maxdepth 1 -name "*.csv" -delete

Também percebi que você usou o -r flag com rm , o que pode parecer não intencional, já que você está realizando uma pesquisa simples usando ls seguido por uma exclusão recursiva com rm . / p>

Francamente, não sei se faz muito sentido escrever um script para essa tarefa. Qual o benefício que esse script oferece ao executar os comandos diretamente? Em outras palavras, o que há de errado com isso:

# Check for files
ls *.csv

# Delete the files
rm *.csv

Por que executar seu script melhor do que executar esses comandos? Parece que você está apenas adicionando sobrecarga e substituindo uma mensagem de erro por outra.

    
por 08.11.2017 / 15:15