2016-12-08 2 views
0

Ich brauche alle Dateien mit einer bestimmten Zeichenfolge und tar sie zu finden. Ich habe die folgende Syntax verwendet, aber es funktioniert nicht.wie tar Befehl mit find exec und grep in linux

find . -iname '*.log' -exec grep -l 'abcdef' {} tar mytar.tar.gz -T - \; 

Und das will ich nicht über die Pipeline-Syntax wie unten verwenden (aus bestimmten Gründen)

find . -name '*.log' | xargs grep -l 'abcdef' | tar Mytar.tar.gz -T - 

Ich muß mit exec finden verwenden und jede Datei grep und die resultierende Liste von Dateien tar.

Dank

+0

Sie gehen zu müssen, ein Rohr verwenden, * irgendwo *, wahrscheinlich etwas wie 'finde ... -exec sh -c 'grep ... | Teer ... ". Was ist deine Abneigung gegen Pfeifen? – chepner

+2

Nun - Sie könnten sicherlich zwei separate '-exec'-Klauseln verwenden, eine, um die Datei zu vergrößern, eine zweite, um 'tar' mit Namen aufzurufen, für die' grep' einen Exit-Status von 0 zurückgegeben hat. Aber ... ja, Warum die Abneigung gegen Pfeifen? –

+0

Ich führe das in einem Container und es ist irgendwie nicht Pfeifen zu ehren. – user2050188

Antwort

2

Sie grep -lR --null verrohrt zu xargs -0 tar ... für diese verwenden:

grep -lR --null --include='*.log' 'abcdef' . | xargs -0 tar cvzf mytar.tar.gz -T - 
+0

@ user2050188: Hat das geklappt? – anubhava

+0

HelloIch verwende den absoluten Pfad in meinem grep-Befehl (/ logs/dir1/subdir1 /) anstelle von. Und es heißt Entfernen von führenden/von Elementnamen. Wenn ich mit tar -P --absolute Namen cvzf Mytar.tar.gz versuchte, heißt es: Sie müssen eine der Optionen - Acstrux oder --test-label angeben. Ich versuche immer noch, eine Lösung zu finden – user2050188

+0

Sie können tun: 'cd/logs/dir1/subdir1 /; grep -lR --null --include = '* .log' 'abcdef'. | xargs -0 tar cvzf mytar.tar.gz -T- – anubhava

1

Process substitution kommt zu retten, wenn Sie Rohre hassen:

tar -czf mytar.tar.gz -T <(find . -type f -iname '*.log' -exec grep -l 'abcdef' {} +) 
Verwandte Themen