Ich verwende find
zum Suchen und Löschen von Sicherungsdateien, möchte jedoch bestimmte Verzeichnisse von der Suche ausschließen. Die Backup - Dateinamen enden in könnten .bck
, bak
, ~
, oder backup
.
Der MWE-Code (Minimal Working Example) mit nur drei auszuschließenden Verzeichnissen lautet:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
Die Syntax \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
scheint etwas klobig zu sein, besonders wenn etwa zehn Verzeichnisse ausgeschlossen werden müssen, obwohl ich in der MWE nur drei gezeigt habe.
Gibt es eine elegantere Möglichkeit, entweder eine Eingabedatei mit der Liste der ausgeschlossenen Verzeichnisse oder ein Array- oder Listen-ähnliches Konstrukt zu verwenden, das in Betrieb genommen werden könnte?
Es tut mir leid, dass ich nicht expliziter war, als ich meine ursprüngliche Frage schrieb.
NB: trash-put
ist ein Dienstprogramm, mit dem die Dateien nach Trashcan
verschoben werden, anstatt sie zu löschen [1].
Mit GNU find (dh unter nicht eingebettetem Linux oder Cygwin) können Sie
-regex
alle diese-path
Platzhalter zu einem einzigen regulären Ausdruck kombinieren .Verwenden Sie bei FreeBSD oder OSX
-E
anstelle von-regextype posix-extended
.quelle
Gruppieren Sie
-path ... -prune
in einem Ausdruck, der\( ... \)
mithilfe von-o
( oder ) Logik eingeschlossen ist.Das Beispiel wird nicht Iterierte Verzeichnisse oder Dateien auf oder unter
/somepath/a
,/somepath/b
und/somepath/c
.Hier ist ein spezifischeres Beispiel mit mehreren Aktionen.
quelle
Dies scheint eher eine Shell-Frage als eine
find
Frage zu sein. Mit einer Datei, die( -name dir1 -o -name dir2 ) -prune
(kein "\"!) Enthält, können Sie dies einfach tun:Ohne den Suchaufruf selbst zu
eval find
ändern (auf oder durch Ändern von $ IFS) funktioniert dies jedoch nur mit Pfaden ohne Leerzeichen.Wenn Sie die Datei einfacher halten möchten, können Sie ein Skript schreiben.
Und verwenden
stattdessen.
quelle
-name
bypath
).\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
bestimmte Verzeichnisse von der rekursiven Suche auszuschließenfind
. Ich suche nicht nach etwas in Dateien, sondern lösche bestimmte Dateien und vermeide bestimmte Verzeichnisse in meinem Suchpfad. Ich verstehe auch nicht, was Ihr Skript versucht. Es scheint also, dass wir eine Fehlkommunikation haben. Es tut uns leid. Lassen wir es dabei.