Como redirecionar a saída unzip -v para um arquivo de log no shell script [duplicado]

0

Eu tenho um script que faz um loop em todos os arquivos zip em um diretório grande e os descompacta individualmente. Estou usando a opção -q para manter o console limpo e exibir outras informações de monitoramento.

Eu gostaria de manter esse mesmo comportamento, mas gostaria de adicionar a saída da opção -v para um único arquivo de log de toda a operação. Qual seria a melhor maneira de realizar isso? Btw, eu ainda sou um pouco verde quando se trata de scripting, então qualquer entrada seria apreciada.

Descompacte a parte do script:

for FILES in $(ls -1Sr|grep a_media*)
 do unzip -q $FILES -d $DESTINATION
done
    
por dnbpanda 19.06.2015 / 15:35

2 respostas

2

Você pode redirecionar stdout e stderr para todo o loop:

for FILES in $(ls -1Sr|grep a_media*)
 do unzip -q "$FILES" -d "$DESTINATION"
done > log 2>&1

Com pelo menos zsh e versões recentes de bash , você pode substituir > log 2>&1 por >& log .

Seu processamento ls é suspeito, consulte Por que * not * pars 'ls'? ...

    
por 19.06.2015 / 15:59
0

Primeiramente, sugiro que você coloque as variáveis $FILES e $DESTINATION no comando unzip entre aspas duplas, já que no caso de caminhos que contenham espaços eles quebrarão o comando unzip ; Note também que o seu script irá quebrar em nomes de arquivos contendo novas linhas, devido a ls produzir os nomes de arquivos "brutos" contendo as novas linhas para o pipe; use o recurso globbing de bash ( for FILES in /path/to/archives/* [...] ).

Segundo, quando você não executa unzip com a opção -q , que suprime a saída normal, a saída é gravada em stdout (STDandard OUTput), que é um arquivo tipicamente vinculado à tela do terminal ; shells como bash podem redirecionar a saída de um comando de stdout para outro arquivo: por exemplo, em bash , isso pode ser feito por meio dos operadores > e >> , que respectivamente 1. Cria o arquivo se não existir ou truncar, em seguida, anexa a saída a ele e 2. Cria o arquivo, se não existente, ou anexa a saída a ele.

Portanto, nesse caso, como você está processando vários arquivos, não deseja truncar o arquivo de registro toda vez que um novo arquivo é processado, mas prefere anexar a nova saída ao log existente; incluindo minhas correções:

for FILES in /path/to/archives/*
do
    unzip -v "$FILES" -d "$DESTINATION" >> /path/to/logfile
done
    
por 19.06.2015 / 16:06