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

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

Eu tenho um conjunto de pastas e um conjunto de *.DATarquivos.
Quero remover um *.DATarquivo 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 sedpara remover .DATse 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 .DATarquivos, 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.

informação relacionada