Script de shell: Excluir arquivos quando a pasta com o mesmo nome não existir

0

Eu tenho um conjunto de pastas e um conjunto de arquivos *.DAT .
Desejo remover um arquivo *.DAT se nenhuma pasta com o mesmo nome (sem .DAT ) existir.
Demorei 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 eu sinto que deveria haver uma solução muito mais fácil (elegante one-liner? sem criar um arquivo? ...?). Estou certo?

    
por mic 11.03.2018 / 09:51

1 resposta

2

Você não precisa usar sed para remover o .DAT se estiver usando bash : a expansão do parâmetro integrado ${F%.DAT} é a mesma sem usar um subshell e um programa externo.

Se os diretórios estivessem em locais arbitrários relativos aos arquivos .DAT , então um arquivo de lista de diretórios é a maneira mais eficiente de resolvê-lo, mas considerando que 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 manipulará nomes de arquivos com espaços incorporados, o que sua solução não faz.

Para outros shells, uma técnica similar pode ser usada, mas não posso falar por eles.

    
por 11.03.2018 / 11:43

Tags