Como sempre, no Linux, um único comando serve:
for i in $(find /path/to/source/dir -type f -exec echo {} \;) ; do tar -c -f path/to/dest/directory/${i##*/}.tar -C ${i%/*} ${i##*/} ; done
Certifique-se de que o diretório de origem seja especificado por meio de seu nome de caminho completo, não de um parente; o resto é óbvio, eu usei muito as capacidades de substituição de shell.
EDIT: enquanto eu estava escrevendo minha resposta, uma outra resposta afirmou que não se pode apagar a estrutura de diretórios. Isso não está correto, a opção -F no tar faz exatamente isso. Com este comando, você encontrará todos os arquivos vindos da árvore de diretórios no diretório / path / to / source /, todos apropriadamente alcatroados e empilhados ordenadamente dentro do diretório / diretório / caminho / diretório / dest /.
Editar: a alteração solicitada, ou seja, a exclusão de arquivos cujos nomes começam com captura, pode ser realizada por meio do seguinte comando:
for i in $(find /path/to/source/dir -type f ! -name 'catch*' -exec echo {} \;) ; do tar -c -f path/to/dest/directory/${i##*/}.tar -C ${i%/*} ${i##*/} ; done
Se você quiser evitar que os arquivos terminem com o catch, suspenda o susbstitute * com * catch, tenho certeza que você entendeu.