2017-04-06 3 views
2

Ich konnte die Aktion -prune des Befehls find nie vollständig verstehen. Aber in Wirklichkeit stammt zumindest ein Teil meines Mißverständnisses von der Wirkung des Weglassens des Ausdrucks »Ausdruck«.'-print' aus dem Befehl 'find' auslassen, wenn '-prune' verwendet wird

Von der Seite ‚finden‘ Mann ..

„Wenn der Ausdruck keine andere Aktionen als -prune enthält, -Druck auf alle Dateien, für die durchgeführt wird, der Ausdruck wahr ist.“

.. was ich immer (seit vielen Jahren) so gemeint habe, dass ich '-print' weglassen kann.

Wie jedoch das folgende Beispiel zeigt, ist ein Unterschied zwischen der Verwendung von '-print' und dem Auslassen von '-print', zumindest wenn ein '-prune' Ausdruck erscheint.

Zunächst einmal habe ich die folgenden 8 Verzeichnisse unter meinem Arbeitsverzeichnis ..

aqua/ 
aqua/blue/ 
blue/ 
blue/orange/ 
blue/red/ 
cyan/blue/ 
green/ 
green/yellow/ 

Es gibt insgesamt 10 Dateien in diesen Verzeichnissen 8 ..

aqua/blue/config.txt 
aqua/config.txt 
blue/config.txt 
blue/orange/config.txt 
blue/red/config.txt 
cyan/blue/config.txt 
green/config.txt 
green/test.log 
green/yellow/config.txt 
green/yellow/test.log 

Mein Ziel ist Verwenden Sie "Find", um alle regulären Dateien anzuzeigen, die nicht den Pfad "blau" enthalten. Es gibt fünf Dateien, die diese Anforderung erfüllen.

Dies funktioniert wie .. erwartet

% find . -path '*blue*' -prune -o -type f -print 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./aqua/config.txt 

Aber als ich ‚-print‘ es gibt die fünf gewünschten Dateien lassen sich nicht nur, sondern auch ein beliebiges Verzeichnis, dessen Pfadname ‚blue‘ enthält ..

% find . -path '*blue*' -prune -o -type f 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./cyan/blue 
./blue 
./aqua/blue 
./aqua/config.txt 

Warum werden die drei 'blauen' Verzeichnisse angezeigt?

Dies kann von Bedeutung sein, da ich oft versuche, eine Verzeichnisstruktur zu entfernen, die mehr als 50.000 Dateien enthält. Wenn dieser Pfad verarbeitet wird, kann mein find-Befehl, besonders wenn ich eine '-exec grep' für jede Datei mache, sehr viel Zeit in die Verarbeitung von Dateien investieren, für die ich absolut kein Interesse habe. Ich muss darauf vertrauen, dass der Fund nicht in die überarbeitete Struktur geht.

Antwort

0

Die implizite -print gilt für den gesamten Ausdruck, nicht nur den letzten Teil davon.

% find . \(-path '*blue*' -prune -o -type f \) -print 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./cyan/blue 
./blue 
./aqua/blue 
./aqua/config.txt 

Es geht nicht in die beschnittenen Verzeichnisse, aber es druckt die oberste Ebene.

Eine leichte Modifikation:

$ find . ! \(-path '*blue*' -prune \) -type f 
./green/test.log 
./green/yellow/config.txt 
./green/yellow/test.log 
./green/config.txt 
./aqua/config.txt 

(mit impliziten -a) führen würde, das gleiche Verhalten aufweisen mit und ohne -print.

Verwandte Themen