Löschen Sie rekursiv alle EXE-Dateien mit demselben Namen wie der Ordner, der sie enthält

2

Ich möchte alle EXE-Dateien im aktuellen Ordner und in allen Unterordnern löschen.

Ich lese das find . -name "*.exe" -exec rm -f '{}' \; tun, aber ich möchte nur löschen, wenn der Containerordner den gleichen Namen wie die .exe hat.

Beispiel:

/me/folder1/folder1.exe    - delete folder1.exe
/me/folder 2/folder 2.exe  - delete 'folder 2.exe'
/me/folder3/otherexe.exe   - do not delete otherexe.exe
xthink
quelle

Antworten:

3

Führen Sie dies in Bash aus. Es iteriert über alles .exe Dateien und vergleicht den Namen des übergeordneten Verzeichnisses mit dem Dateinamen (ohne Erweiterung).

shopt -s extglob
for f in **/*.exe; do
    dir="$(basename "$(dirname "$f")")"  # get dirname
    file="$(basename "${f%.*}")"         # get filename, without extension
    if [ "$dir" = "$file" ]; then
        rm -i -- "$f"
    fi
done

Der Trick, um den unformatierten Verzeichnisnamen zu erhalten, ist das Aufrufen basename auf der dirname der Datei. Alle Ersetzungen müssen jedoch in Anführungszeichen gesetzt werden, damit dieser Befehl mit Dateinamen funktioniert, die Whitespace enthalten.

Wenn Sie vor dem Entfernen von Dateien keine Aufforderung erhalten möchten, entfernen Sie das -i Option für die rm Anruf.

slhck
quelle
Sorry, aber soll ich es in einer Datei speichern, dann ausführen oder einfach auf dem Terminal kopieren / einfügen?
xthink
Sie können einfach den gesamten Code aus Ihrem aktuellen Arbeitsverzeichnis kopieren und einfügen. Sie können es natürlich auch in einem Shell-Skript speichern, aber das ist nicht wirklich nötig.
slhck