Como redirecionar a saída mdfind para outra instância no bash

0

Estou tentando criar um script que procure alguns arquivos, listados em um arquivo de entrada, em todo o computador e copie esses arquivos em uma pasta específica. Até agora tudo ok com um loop for e mdfind "comando" | xargs. Mas se eu adicionar uma declaração if para criar um arquivo de saída com a lista dos arquivos que o mdfind não encontrou, aí vem os problemas. Aqui está o meu código atual:

if [ $# -eq 0 ]
then
echo "Please introduce the name of the input file after runnig the command. 
For this script you need an INPUT.txt file containing only the list of the 
samples you want to copy." 
else
for i in $(cat $1); 
do mdfind "kMDItemDisplayName == $i*.ab1" | xargs -I '{}' cp '{}' 
/Users/xxxxx/xxxxx/xxxxx/xxxxxxx/test_moving/; 
if [ $? -eq 0 ] 
then
echo $i >> extractions_not_found.txt
else
echo $i >> extractions_found.txt
fi
done
fi

Estou usando $? para redirecionar a saída de

 mdfind "kMDItemDisplayName == $i*.ab1" | xargs -I '{}' cp '{}' /Users/xxxxx/xxxxx/xxxxx/xxxxxxx/test_moving/;

mas é sempre = 0, mesmo quando não consegue encontrar o arquivo listado no arquivo de entrada.

Alguém pode me ajudar a entender onde está o erro ??

Obrigado!

    
por WalterC85 23.01.2018 / 19:00

1 resposta

1

Depois de executar mdfind ... | xargs cp ... , o código de erro em $? é o de xargs , pois é o último comando no pipeline. xargs retorna 123 se algum comando executado falhar, mas se mdfind não produzir nenhuma saída, então xargs não fará nada, então também não falhará.

No entanto, no Bash, você pode encontrar os códigos de saída de todos os comandos no último pipeline na variável de matriz % código%. O código de saída do primeiro comando é PIPESTATUS etc.

$ false | true | xargs false
$ echo "${PIPESTATUS[*]}"
1 0 123

Portanto, em vez de usar ${PIPESTATUS[0]} , que lhe dá o status de saída de $? , você pode usar xargs dando a você o status de saída de ${PIPESTATUS[0]} . Ou salve o lote para outra variável e teste os dois. ( mdfind )

Como alternativa, use saved=("${PIPESTATUS[@]}") para que set -o pipefail forneça o código de saída do último comando com falha do pipeline, se algum deles falhar. ( $? resultaria em false | true .)

    
por 23.01.2018 / 21:41

Tags