Почему tar использует абсолютный путь, хотя я изменился на dir с помощью -C?

Для управления глубиной дерева используйте опцию -L.

tree -d -L 2.

2
29.07.2020, 16:28
1 ответ

Поскольку $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(), поэтому это ограничение не влияет на них.

3
18.03.2021, 23:16

Теги

Похожие вопросы