Ich denke, ich bin ziemlich fortgeschritten in der Verwendung von find, aber jedes Mal, wenn ich es benutze, kann ich mich für mein ganzes Leben nicht an die Methode erinnern, die Option -exec zu schließen. Ich verbringe jedes Mal viel Zeit mit Lesen, wenn ich es benutze. Benutze ich es einfach nicht genug oder erwarte ich zu viel von mir selbst? Beginnen wir mit einem typischen Beispiel, das mich frustriert.
Die Verzeichnisstruktur enthält Dateien mit allen falschen Berechtigungen, versteckte Dateien, symbolische Links usw. Ich möchte den Besitz auf einen angemessenen Wert ändern
find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;
(Verzeih mir, wenn das Ende rückwärts ist ... Ich habe es vor einer Stunde angeschaut und bin mir immer noch nicht sicher)
Aber ich habe Angst, es wegen Reittieren, symbolischen Links usw. zu betreiben. Ich habe den ultimativen Fehler von chmod gemacht. * Und hatte es schon einmal auf mich zurückgeworfen. Ich weiß, dass -xdev auf das Überqueren von Partitionen verzichten wird, aber ich bin nicht sicher, was mit den Dateien in Verzeichnissen geschehen wird, die symbolische Links sind.
Wie beherrscht man dieses Biest, das wichtige Dateien töten kann?
Aktualisieren Sie das Beschneiden der besten Vorschläge unten und fassen Sie zusammen:
- Lassen Sie ein Übungsverzeichnis mit anderen Übungsverzeichnissen verknüpfen und bereitstellen.
- Verwenden Sie xargs anstelle des nicht intuitiven Befehls exec.
- Verwenden Sie -exec echo {} für Vernunft und Sicherheit
- Semikolon ist etwas Besonderes und Sie entkommen ihm, daher steht der Fluchtcharakter an erster Stelle
- Mit dem Befehl -or können Sie Auswahlkriterien kombinieren.
Ich bin ein wenig verwirrt über den print0, aber xargs war schon immer ein bisschen auf die nicht leicht zu verstehende Übung auf den ersten Blick, die ich zu vermeiden versuche.
quelle
Antworten:
Nun, was die
-exec
Syntax angeht, könnte man viele Leute mögen, aufgeben und verwendenxargs
:(oder die Dateien-mit-Leerzeichen-und-anderem-Unsinn-in-ihnen-sicheren Version)
Um sich an das Richtige zu erinnern, das mit dem Semikolon zu tun hat, müssen Sie in Ihren Kopf bohren, dass Sie ein Semikolon verwenden, um den ausgeführten Befehl zu beenden
-exec
, und Sie müssen dem Semikolon entkommen, weil es etwas Besonderes hat Bedeutung zubash
. Deshalb ist es Backslash-Semikolon. Sie scheinen den{}
Ersatzteil in Ordnung zu haben.Wenn Sie etwas Großes und Gefährliches ausführen möchten, von dem Sie sprechen, gehen Sie zunächst wie folgt vor:
und überprüfen Sie die Ergebnisse. Dies ist im Grunde ein "Trockenlauf", bei dem Sie die Befehle sehen, die ausgeführt werden würden, wenn Sie es zulassen. Auf jeden Fall eine gute Praxis. Hilft nicht bei dem
.*
Problem, aber Sie wissen, dass Sie das jetzt nicht tun sollen. :) :)quelle
Ich bin überrascht, dass noch niemand die folgende Option erwähnt hat:
Diese Syntax bestätigt den Befehl, bevor er ausgeführt wird. Dies funktioniert am besten, wenn Sie davon ausgehen, dass es sich bei Ihrer Übereinstimmung um eine relativ kleine Anzahl von Dateien handelt, da für jede Datei eine Aufforderung angezeigt wird.
Einige Antworten erwähnen
xargs
, aber mit GNU finden, dass auch das unnötig ist:Beachten Sie, dass das + normalerweise nicht maskiert werden muss, aber es ist gut, sich daran zu gewöhnen, dies trotzdem zu tun.
quelle
Dafür ist man da: Es kann schwierig sein, sich an Dinge zu erinnern, deshalb enthält der Befehl * nix Manpages. Sie können einfach immer im Abschnitt ACTION der Manpage nach einer Erinnerung an die Syntax suchen :
man find
. Obwohl Manpages nicht besonders freundlich erscheinen, sind sie sehr praktisch, wenn Sie sie einmal gut gelesen haben.Erstellen eines Frontends oder Wrappers: Als ich bei GNU find besser werden wollte, habe ich ein GUI-Frontend für find geschrieben , das Suchbefehle mit Python, Glade und Pygtk generiert. Dies ist eine gute Übung, wenn Sie sie wirklich gut kennenlernen möchten.
Haben Sie ein Übungsverzeichnis: Schließlich habe ich immer ein 'Scrap'-Verzeichnis in meinem Home-Verzeichnis, um mit leistungsstarken Befehlen zu spielen, wenn etwas wie' Echo 'es nicht schneidet. Sie können die Shell-Erweiterung verwenden, um schnell eine Reihe von Dateien mit folgenden Elementen zu erstellen:
quelle
Sie können Suchausdrücke auch mit den Operatoren '-und' und '-or' kombinieren. -und ist implizit:
ist das gleiche wie
Der Operator oder kann Ihre Liste mit 4 Befehlen auf 2 reduzieren:
Und schließlich kann nicht die Suche, sondern Chown auch die Gruppe setzen. Wenn wir also auch mit Leerzeichen in Namen umgehen, erhalten wir:
quelle
Beim Schließen denke ich nur an die Verwendung; wie bei vielen Programmiersprachen und dann entkommen. Denken Sie daran, dass es entkommen muss und es Ihnen ziemlich leicht fällt.
quelle
Abhängig von der Version von find, die Sie verwenden, gibt es verschiedene Optionen, die Ihnen helfen können. Der GNU-Fund ist wahrscheinlich der mächtigste und dies kann Ihnen bei Ihrer zweiten (impliziten) Frage helfen
Zum Beispiel - das Standardverhalten besteht nicht darin, symbolische Links zu dereferenzieren, aber Sie können dies überschreiben. und die Option -mount stoppt das Auffinden von Mount-Punkten
Schauen Sie in Ihren lokalen Manpages nach
quelle
Einige würden argumentieren, dass die Option xargs schneller ist als die Option -exec, da der Befehl nicht für jede Datei einmal ausgeführt wird, aber ich würde mir darüber keine Sorgen machen, außer für massive Jobs, die nicht trivial viel Zeit in Anspruch nehmen.
Persönlich laufe ich normalerweise nur find ohne exec
Stellen Sie sicher, dass die Ausgabe korrekt aussieht, und führen Sie dann meinen Befehl für diese Liste aus.
quelle
Für einige Muscheln (nicht Bash) entkommen Sie {} für ein korrektes Verhalten.
find manual ist gut für das Beherrschen von find.
quelle
Bevor Sie so etwas tun, stellen Sie sicher, dass sich das Verzeichnis, für das Sie diesen Befehl ausführen, nicht im selben Dateisystem befindet wie / usr oder / etc. (Andernfalls, wenn ich einen festen Link zu / etc / passwd oder / bin / sh in meinem Home-Verzeichnis habe, haben Sie mir gerade das Eigentum an diesen gegeben und als Nebeneffekt besitze ich jetzt die Maschine).
Wenn Sie ein Verzeichnis durchsuchen und alle Dateien / Verzeichnisse durchsuchen möchten, ist dies ganz einfach
chown -Rh Benutzer: Benutzergruppe Benutzer /
werde es tun. Stellen Sie sicher, dass Sie das -h oder chown verwenden, um symbolischen Links zu folgen.
quelle