Ich bin fast fertig mit dem Skript, aber dies gibt Verzeichnisse aus. Was ich möchte, ist eine Ausgabe von Dateien. Wie auch immer, einer von euch will mir helfen? :)
#!bin/bash
( find /testftp/* -type d ;
find /testftp/* -type f -iname DONOTDELETE.TXT -printf '%h'
) | sort | uniq -u
Ausgabe ist:
/testftp/logs
Die Ausgabe ist das Verzeichnis, in dem DONOTDELETE.TXT nicht vorhanden ist. Es ist ziemlich nah. Müssen nur die Dateien anzeigen.
-exec list {}/*
statt-printf '%h'
. Wenn es die richtigen Dateien zeigt nur , vielleicht können Sie versuchen-exec rm -f {}/*
( Achtung: Diese gefährlich! ). Auch das kann nützlich sein.( find /testftp -type d ; find /testftp -type f -iname DONOTDELETE.TXT -exec list {} \; ) | sort | uniq -u
wird ausgegeben: `find: list: Keine solche Datei oder Verzeichnis / testftp / testftp / logger / testftp / logs` DONOTDELETE.TXT ist unter `/ testftp /ls
nicht sein sollenlist
(immer vergessen!)Antworten:
Hier ist meine Meinung dazu:
Fügen Sie dies einem Skript hinzu, ändern Sie die Variablen nach Belieben mit Ihrer eigenen Namenskonvention (für die spezielle Datei und den Protokollnamen) und rufen Sie sie dann einfach mit dem Startverzeichnispfad als Parameter auf. Es schließt alle Verzeichnisse aus, die die gewünschte Datei enthalten, und löscht alle anderen.
quelle
Ich dachte, ich würde es versuchen.
quelle
find ./testftp/* -type d
"; exists = $ (ls $ dir | für jeden in $ (find $ dir -type f -iname $ ignorefile -printf '% h \ n'); do echo -en "grep -v $ each |"; done | sed ' $ s /.$// ') direxists = $ (ls $ dir | eval $ existiert | grep -v $ ignorefile | sed' s /: / \ // g '| sort | uniq -u) für pth in $ direxists ; do if [-d $ pth]; dann wenn ["$ (ls-A $ pth)"]; dann echo rm -f "" $ pth * "" fi fi done `Aber es hat nichts getan :(Wenn Sie Bash 4+ haben (überprüfen Sie mit
bash --version
), können Sie dies in einem Zweizeiler tun:Beachten Sie, dass
shopt -s globstar
es in einer eigenen Zeile stehen muss - stellen Sie es nicht einfach vor die for-Schleife mit einem;
../**/
wird in alle Unterverzeichnisse des aktuellen Verzeichnisses und deren Unterverzeichnisse rekursiv erweitert. Wenn Sie nur eine Ebene in den Baum gehen möchten, verwenden Sie./*/
stattdessen (und kümmern Sie sich nicht darum, globstar einzustellen). Wenn Sie eine feinere Kontrolle wünschen, müssen Siefind
stattdessen damit herumspielen (insbesondere mit den Optionen-maxdepth
und-mindepth
). Ich benutze./**/
anstatt für den**/
Fall, dass eines Ihrer Verzeichnisse mit einem beginnt-
: Dies verhindert, dass sie als "" angesehen werden[[ -f "$f"/DONOTDELETE.TXT ]]
testet, ob diese Datei existiert und eine Datei ist (wenn Sie möchten, dass sie funktioniert, auch wenn DONOTDELETE.TXT keine Datei ist, verwenden Sie-e
anstelle von-f
). Genau genommen brauchen Sie das nicht/
, da $ f einen abschließenden Schrägstrich enthält, aber ich denke, dass es so besser aussieht und redundante Schrägstriche im Allgemeinen harmlos sind.||
Bedeutet ODER - wenn (und nur wenn) dieser Test falsch ist , wird der Code rechts davon ausgeführt. In diesem Fall werdenrm -f "$f"/*
alle Dateien mit Ausnahme der versteckten Dateien gelöscht.Wenn Sie auch versteckte Dateien löschen möchten, können Sie Folgendes verwenden:
quelle