Se bem entendi, você deseja mover os arquivos do diretório atual e de seus subdiretórios recursivamente para outro diretório, mas somente se o comando file os relatar como arquivos "Microsoft Word". Ou seja, você está interessado nos arquivos para os quais file "$filename" | grep 'Microsoft Word' produz alguma saída.
Uma maneira fácil é levar as coisas com calma e arquivar por arquivo. Se você quiser apenas os arquivos no diretório atual, poderá usar um loop for e um padrão curinga:
for f in *.doc; do
if …
done
Qual é a condição? Queremos testar se Microsoft Word aparece na saída de file "$f" . Eu uso file -- para proteger contra arquivos cujo nome começa com - .
for f in *.doc; do
if file -- "$f" | grep -s 'Microsoft Word'; then
…
fi
done
Tudo o que precisamos fazer é adicionar o comando para mover os arquivos.
for f in *.doc; do
if file -- "$f" | grep -s 'Microsoft Word'; then
mv -- "$f" ../NewDirectory/
fi
done
Se você quiser procurar arquivos em subdiretórios também, use o ** padrão wilcdard para globalização recursiva. No bash, ele precisa ser ativado com shopt -s globstar (em ksh93, você precisa de set -o globstar e, em zsh, funciona fora da caixa; outros shells não possuem esse recurso). Cuidado que bash ≤4.2 segue links simbólicos para diretórios.
for f in **/*.doc; do
if file -- "$f" | grep -s 'Microsoft Word'; then
mv -- "$f" ../NewDirectory/
fi
done
Observe que todos os arquivos movidos terminam em ../NewDirectory/ , nenhum subdiretório é criado. Se você quiser reproduzir a árvore de diretórios, use construções de manipulação de string para extrair a parte do diretório do nome do arquivo e mkdir -p para criar o diretório de destino, se necessário.
for f in ./**/*.doc; do
if file "$f" | grep -s 'Microsoft Word'; then
d="${f%/*}"
mkdir -p ../NewDirectory/"$d"
mv "$f" ../NewDirectory/"$d"
fi
done
Em vez de analisar a saída de file , que é um pouco frágil, talvez você prefira analisar file -i , que imprime strings padronizadas.