2017-07-05 3 views
1

Ich muss Berechtigungen für eine große Anzahl von Dateien aus einer Teilmenge von Verzeichnissen auf einem großen NFS-Volume beheben.Ist es möglich, -exec Befehle in Linux zuverlässig zu verschachteln?

in eine Lösung aufzubauen, begann ich von Fund mit einer Liste der Verzeichnisse zu erhalten Ich mag:

find . -type d -regex "^./[0-9]*" 

Die alle Verzeichnisse mit einer Zahl beginnen.

Ich kann dies erfolgreich zu einem zweiten Fund führen. Das find bekommt Dateien, die einige Dateinamen ausschließen will ich nicht zu verarbeiten:

find . -type d -regex "^./[0-9]*" -exec find {} -type f \(! -iname '.*' ! -name 'async.log' \) \; 

Das alles funktioniert gut aus und gibt die Liste der Dateien, die ich verarbeiten müssen.

Nun zum Problem:

Was ich wirklich will, ist den zweiten Fund verwenden chmod -exec 644. ich einen Weg gefunden habe, dies mit xargs zu tun, das gut zu funktionieren scheint. In den Beispielen verwende ich echo nur, um die Liste der zurückgegebenen Dateien zu überprüfen.

find . -type d -regex "^./[0-9]*" | xargs -I dirname find dirname -type f \(! -iname '.*' ! -name 'async.log' \) -exec echo {} \; 

Aber was würde Ich mag es nur mit meiner gekettet find Befehle verwenden -exec, da es als Rohrleitungen, die Ergebnisse zu xargs ein Vielfaches schneller ist, aber etwas schief geht mit den Ergebnissen:

find . -type d -regex "^./[0-9]*" -exec find {} -type f \(! -iname '.*' ! -name 'async.log' \) \; -exec echo {} \; 

Wenn ich die Ausgabe an eine Datei sende, gibt es eine Diskrepanz und der geschachtelte Suchbefehl scheint vor der vollständigen Beendigung zu stoppen.

Beim Vergleich der 2 Dateien hat die xargs-Version 173125 Zeilen, während der verschachtelte find-Befehl nur 173060 Zeilen hat.

Die letzte Zeile in der Such Version zeigt Abschneiden:

./104/5734c420e70d8.pdf 
./104 

ich ratlos bin, dies zu erklären, oder mit einer Art und Weise zu debuggen kommen oder das Problem umgehen. Irgendwelche Ideen, wie ich meine find only-Lösung zum Laufen bringen könnte?

+0

** es ist viel schneller, als die Ergebnisse an xargs zu leiten ** Unwahrscheinlich, da '-exec' mit' \; 'beendet wird, erzeugt für jeden gefundenen Eintrag eine neue Shell mit dem Befehl' find'. – anubhava

Antwort

1

Ich denke, es sollte einfacher sein, wenn Sie find nur einmal verwenden.

Die folgende Lösung funktioniert so lange, bis sich alle von Ihnen gesuchten Verzeichnisse im selben Verzeichnis befinden.

find {0,1,2,3,4,5,6,7,8,9}* -type f \(! -iname '.*' ! -name 'async.log' \) -exec chmod 644 {} \; 

Suchen im aktuellen Verzeichnis alle Verzeichnisse, die von einer Reihe beginnend, Datei, beginnend mit einem Punkt ausschließen, schließen Dateibefehl async.log und anwenden namens chmod 644 gefunden Datei.

+0

Sie können '{0..9} *' anstelle von '{0,1,2,3,4,5,6,7,8,9} *' –

+0

verwenden. Funktioniert perfekt für mich in dieser Situation. Vielen Dank! – gview

+0

Gern geschehen =) –

Verwandte Themen