Shell-Skript: Dateien löschen, wenn kein Ordner mit gleichem Namen vorhanden ist

Shell-Skript: Dateien löschen, wenn kein Ordner mit gleichem Namen vorhanden ist

Ich habe eine Reihe von Ordnern und eine Reihe von *.DATDateien.
Ich möchte eine Datei entfernen *.DAT, wenn kein Ordner mit demselben Namen (ohne .DAT) vorhanden ist.
Es hat einige Zeit gedauert, bis ich diese Lösung gefunden habe:

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

Aber ich denke, es müsste eine viel einfachere Lösung geben (eleganter Einzeiler? Ohne eine Datei zu erstellen? ...?). Habe ich recht?

Antwort1

Sie müssen nicht verwenden, sedum zu entfernen, .DATwenn Sie verwenden bash: Die integrierte Parametererweiterung ${F%.DAT}erreicht dasselbe ohne die Verwendung einer Subshell und eines externen Programms.

Wenn sich die Verzeichnisse an beliebigen Orten im Verhältnis zu den .DATDateien befänden, wäre eine Verzeichnislistendatei die effizienteste Lösung. Da sich aber beide am gleichen Ort befinden, lautet eine viel einfachere Antwort:

find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done

Beachten Sie, dass hierdurch Dateinamen mit eingebetteten Leerzeichen verarbeitet werden, was bei Ihrer Lösung nicht der Fall ist.

Für andere Shells kann eine ähnliche Technik verwendet werden, für sie kann ich jedoch nicht sprechen.

verwandte Informationen