Como você marcou esse linux , presumimos que você tenha o GNU find e o GNU tar .
Se seus nomes de arquivos não tiverem novas linhas incorporadas e você não quiser arquivar diretórios vazios:
find "$3" -type f \! -empty \! -name '.*' | tar cvf "$1/$2" -T -
find localiza os arquivos relevantes e -T - diz tar para ler a lista de arquivos a serem arquivados de stdin .
Refinando isso, se você quiser incluir diretórios vazios:
find "$3" \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) | \
tar cvf "$1/$2" -T -
E se você também quiser lidar com nomes de arquivos com novas linhas incorporadas:
find "$3" \( \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) \) -print0 | \
tar cvf "$1/$2" --null -T -