Когда нужно архивировать не весь каталог, а только часть - с фильтрацией и даже переименованием путей внутри архива - на помощь приходят
find, tar и его флаг --transform.▪️ Базовый пример: фильтруем по маске и архивируем
find project/ -type f -name "*.conf" > list.txt
tar -czf config_backup.tar.gz -T list.txt
Тут мы архивируем только .conf-файлы.
▪️ Добавим переименование путей внутри архива. Архивируем все из src/, но хотим, чтобы внутри архива это лежало как app/.
tar -czf app.tar.gz \
--transform='s|^src|app|' \
-C ./ src
--transform использует sed-подобные выражения. Тут s|^src|app| означает: заменить в начале пути src на app.▪️ Упаковка через find + --transform + относительные пути. Предположим, хотим архивировать только .sh и .py-файлы, заменив scripts/ на bin/ внутри архива:
find scripts/ -type f \( -name "*.sh" -o -name "*.py" \) > filelist.txt
tar -czf bin_scripts.tar.gz \
--transform='s|^scripts|bin|' \
-T filelist.txt
▪️ Упрощенный однострочник:
find scripts/ -type f -name "*.sh" \
| tar -czf archive.tar.gz --transform='s|^scripts|bin|' -T -
▪️ Продвинутый пример: исключения + трансформация + директория
find ./src -type f ! -name "*.tmp" \
| tar -czf src_clean.tar.gz \
--transform='s|^./src|clean_src|' \
-T -
BashTex 📱 #bash #utils