Você não especifica em sua pergunta se é um requisito para preservar a estrutura de diretório na cópia ou se você só precisa de uma cópia dos arquivos. Para simplesmente copiar todos os arquivos não nomeados * .data, você pode usar isto:
find . -type f ! -name '*.data' | xargs cp -t ../destination_dir/
Por outro lado, se você quiser preservar a estrutura de diretórios, pode usar algo assim:
for file in 'find . ! -name '*.txt' | sed 's/^.\///''; do if [ -d "./$file" ]; then mkdir -p "../destination_dir/$file"; else cp "./$file" "../destination_dir/$file"; fi; done
Não tenho certeza se existe uma maneira mais simples de fazer isso, mas esse comando faz o seguinte:
Encontre todos os arquivos e pastas no diretório atual ou suas subpastas não correspondem a * .data para cada um:
Teste se o arquivo é um diretório se ele for um diretório correspondente no diretório de destino ou, se for um arquivo, copiá-lo para o destino.
Editar: Adicionando versão do script de shell:
#!/bin/bash
# Disable shell glob expansion within the script
# Required to stop bash from expndinging the glob in
set -f
for file in 'find . ! -name | sed 's/^.\///''
do if [ -d "./$file" ]; then
mkdir -p "/$file"
else
cp "./$file" "/$file"
fi
done