
Eu tenho um conjunto de pastas e um conjunto de *.DAT
arquivos.
Quero remover um *.DAT
arquivo se não existir nenhuma pasta com o mesmo nome (sem .DAT
).
Levei algum tempo para chegar a esta solução:
find . -type d > dirs.txt
for F in `find *.DAT`
do
F=$(sed 's|\.DAT||g' <<< $F)
if grep "$F" dirs.txt; then
echo "$F found"
else
rm $F.DAT
fi
done
Mas acho que deveria haver uma solução muito mais fácil (uma linha elegante? sem criar um arquivo? ...?). Estou certo?
Responder1
Você não precisa usar sed
para remover .DAT
se estiver usando bash
: a expansão de parâmetro embutida ${F%.DAT}
consegue o mesmo sem usar um subshell e um programa externo.
Se os diretórios estiverem em locais arbitrários em relação aos .DAT
arquivos, um arquivo de lista de diretórios é a maneira mais eficiente de resolvê-lo, mas como ambos estão no mesmo local, uma resposta muito mais direta é:
find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done
Observe que isso tratará nomes de arquivos com espaços incorporados, o que sua solução não faz.
Para outros projéteis, uma técnica semelhante pode ser usada, mas não posso falar por eles.