Usa lo -T
caratteristica di tar per dirgli di leggere l'elenco dei file da un altro file (tar tratta ogni riga come un file separato).
Puoi quindi utilizzare <()
notazione per fare in modo che la tua shell generi uno pseudo-file dall'output di un comando:
tar cf ctlfiles.tar -T <(find /home/db -name "*.ctl")
Se la tua shell non supporta <()
notazione, puoi usare un file temporaneo:
find /home/db -name "*.ctl" > ctlfile-list
tar cf ctlfiles.tar -T ctlfile-list
rm ctlfile-list
Puoi usare la funzionalità -print0 di find con la funzionalità -0 di xargs, in questo modo:
find /home/db -name '*.ctl' -print0 | xargs -0 tar -cf ctlfiles.tar
-print0 (che è il trattino-print-zero) dice a find di usare un null come delimitatore tra i percorsi invece degli spazi, e -0 (che è il trattino zero) dice a xargs di aspettarsi lo stesso.
Modificato per aggiungere:
Se hai un gran numero di file, xargs può invocare tar più di una volta. Consulta i commenti per sapere come gestirlo o fai in modo che find invoke tar direttamente, come questo, che funziona con qualsiasi numero di file, anche se hanno spazi o caratteri di nuova riga nei loro nomi:
rm -f ctlfiles.tar
find /home/db -name '*.ctl' -exec tar -rf ctlfiles.tar {} +
Quando l'ar " sono separate da null.
Quindi quanto segue funziona con un numero arbitrario di file, possibilmente contenenti caratteri di nuova riga:
find /home/db -name '*.ctl' -print0 | tar --null -T - -cf ctlfiles.tar