Verwenden Sie den -T
Funktion von tar, um es anzuweisen, die Liste der Dateien aus einer anderen Datei zu lesen (tar behandelt jede Zeile als separate Datei).
Sie können dann <()
verwenden Notation, damit Ihre Shell eine Pseudodatei aus der Ausgabe eines Befehls generiert:
tar cf ctlfiles.tar -T <(find /home/db -name "*.ctl")
Wenn Ihre Shell <()
nicht unterstützt Notation können Sie eine temporäre Datei verwenden:
find /home/db -name "*.ctl" > ctlfile-list
tar cf ctlfiles.tar -T ctlfile-list
rm ctlfile-list
Sie können die Funktion -print0 von find mit der Funktion -0 von xargs wie folgt verwenden:
find /home/db -name '*.ctl' -print0 | xargs -0 tar -cf ctlfiles.tar
-print0 (das ist Bindestrich-Druck-Null) weist find an, eine Null als Trennzeichen zwischen Pfaden anstelle von Leerzeichen zu verwenden, und -0 (das ist Bindestrich-Null) weist xargs an, dasselbe zu erwarten.
Hinzufügen bearbeitet:
Wenn Sie eine große Anzahl von Dateien haben, kann xargs tar mehr als einmal aufrufen. Sehen Sie sich die Kommentare an, um damit umzugehen, oder lassen Sie find tar direkt aufrufen, so wie hier, was mit einer beliebigen Anzahl von Dateien funktioniert, selbst wenn sie Leerzeichen oder Zeilenumbrüche in ihren Namen haben:
rm -f ctlfiles.tar
find /home/db -name '*.ctl' -exec tar -rf ctlfiles.tar {} +
Wenn das Argument nach "-T" "-" ist, wird die Liste der Dateien von stdin übernommen. Neuere Versionen von tar unterstützen normalerweise die Option "-null", die angibt, dass die Dateien, die in der Quelle angegeben sind, die durch "-T " Option sind durch Nullen getrennt.
Daher funktioniert Folgendes mit einer beliebigen Anzahl von Dateien, die möglicherweise Zeilenumbrüche enthalten:
find /home/db -name '*.ctl' -print0 | tar --null -T - -cf ctlfiles.tar