O código de erro retornado por find
não tem nada a ver com a localização de arquivos. Ele só retornará um código de falha se o próprio comando não for executado. O que você está procurando é algo como:
while IFS=, read -r file rest
do
find $sourcefolder -name "${file}" -exec cp '{}' $destfolder \;
## Check if the file was copied
[[ -e "$destfolder/$file" ]] || echo "File $file was not copied"
done < "$csv"
echo "Finished"
Dessa forma, o script informará sobre todos os arquivos que não foram copiados com êxito.
Se você quiser imprimir o erro apenas no final do script, poderá salvar os nomes de arquivo incorretos em uma variável e imprimi-lo após a conclusão do loop:
while IFS=, read -r file rest
do
find "$sourcefolder" -name "$file" -exec cp '{}' "$destfolder" \;
## Check if the file was copied
[[ -e "$destfolder/$file" ]] || badfiles=$(printf "%s\n%s" "$file" "$badfiles")
done < "$csv"
## Check if all the files were correctly copied
if [[ -z "$badfiles" ]]; then
echo "All files were succesfuly copied."
else
printf 'Some files were not copied:\n%s\n' "$badfiles"
fi
Você também pode estender isso para evitar a substituição de arquivos com o mesmo nome:
while IFS=, read -r file rest
do
find "$sourcefolder" -name "$file" -print0 |
while IFS= read -d '' -r filepath; do
c="";
while [[ -e "$destfolder/$file$c" ]]; do
((c++))
done
cp "$filepath" "$destfolder/$file$c"
done
## Check if the file was copied
[[ -e "$destfolder/$file" ]] || badfiles=$(printf "%s\n%s" "$file" "$badfiles")
done < "$csv"
## Check if all the files were correctly copied
if [[ -z "$badfiles" ]]; then
echo "All files were succesfuly copied."
else
printf 'Some files were not copied:\n%s\n' "$badfiles"
fi
Isso falhará se os nomes de arquivo em seu csv puderem conter novas linhas. Se isso for uma possibilidade, altere o primeiro loop while
para:
while IFS= read -d"," -r file rest; do ...
Observe, no entanto, que isso falhará se qualquer linha do csv contiver apenas um nome de arquivo (portanto, sem vírgula). Você não pode ter as duas coisas, se você pode ter linhas sem vírgulas usar a primeira versão e se você pode ter nomes de arquivos com novas linhas, use o segundo.