Для управления глубиной дерева используйте опцию -L
.
tree -d -L 2.
Поскольку $des
содержит /home/user/Desktop
, список файлов, которые вы передаете в tar -T -
, будет:
/home/user/Desktop/bin/analysis.hpp
/home/user/Desktop/bin/classify.hpp
/home/user/Desktop/bin/grade.hpp
[...]
Вам нужно, чтобы этот список был:
analysis.hpp
classify.hpp
grade.hpp
[...]
Если это пути, которые вы хотите сохранить в архиве.
Как правило, вы:
(
cd -P -- "$des/bin" &&
printf '%s\0' *.[hc]pp |
tar --null -T - -zcvf -
) > file.tar.gz
(при условии, что GNU tar
или совместимый ).
Если список файлов достаточно мал, вам не нужно printf
. Вы можете просто сделать:
(
cd -P -- "$des/bin" &&
tar -czvf - -- *.[hc]pp
) > file.tar.gz
Или сжато до кратчайшей формы:
(cd -P -- "$des/bin"&&tar czvf - -- *.[hc]pp)>file.tar.gz
Если существует очень большое количество файлов *.[hc]pp
, это может превысить максимальный размер cmdline+environ, который может принять системный вызов execve()
. Использование printf
в оболочке, где printf
является встроенной, как bash
, позволяет обойти это, потому что встроенные функции не выполняются с помощью системного вызова execve()
, поэтому это ограничение не влияет на них.