
Ich habe eine Reihe von Ordnern und eine Reihe von *.DAT
Dateien.
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, sed
um zu entfernen, .DAT
wenn 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 .DAT
Dateien 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.