tar исключает определенные каталоги, но не подкаталоги

Выражение seds/~/ /gзаменяет каждую тильду символом пробела. Это буквально означает «заменить все, что соответствует регулярному выражению ~пробелом, глобально (во всей строке ввода )». Выражение можно было бы и в этом случае записать как более быстрое y/~/ /, а всю команду sedможно было бы заменить на еще более быстрое tr '~' ' '.

В bashэто более эффективно делается с помощью

comm=${1//\~/ }

Здесь ~нужно экранировать или заключать в кавычки, чтобы его нельзя было расширить до пути к домашнему каталогу текущего пользователя.

В любом случае, $1нужно заключать в двойные кавычки, если вы используете его с echo(, если только вы не хотите, чтобы глобусы оболочки были расширены до имен файлов ), и в идеале команда должна быть написана сprintf(это позволяет избежать интерпретации начального тире в $1как начала некоторой опции для echo,и позволяет избежать интерпретации определенных последовательностей обратной косой черты при некоторых обстоятельствах):

comm=$( printf '%s\n' "$1" | tr '~' ' ' )

Связанные:

0
31.12.2020, 01:09
1 ответ

Вы можете использовать замену процесса и findдля создания списка каталогов, которые вы хотите исключить.
Я предполагаю, что ваша реализация findподдерживает опцию -maxdepth:

cd /var/www
tar cfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site* 

Тестовая установка:

site1/
├── cgi-bin
│   └── file1
├── images
│   ├── cgi-bin
│   │   └── file2
│   └── logs
│       └── file3
├── index.html
└── logs
    └── file4

Выход:

$ tar cvfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site*
site1/
site1/images/
site1/images/logs/
site1/images/logs/file3
site1/index.html

Исключенные каталоги (вывод обеих команд find):

site1/logs
site1/cgi-bin
site1/images/cgi-bin
2
18.03.2021, 22:45

Теги

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