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.