Выражение sed
s/~/ /g
заменяет каждую тильду символом пробела. Это буквально означает «заменить все, что соответствует регулярному выражению ~
пробелом, глобально (во всей строке ввода )». Выражение можно было бы и в этом случае записать как более быстрое y/~/ /
, а всю команду sed
можно было бы заменить на еще более быстрое tr '~' ' '
.
В bash
это более эффективно делается с помощью
comm=${1//\~/ }
Здесь ~
нужно экранировать или заключать в кавычки, чтобы его нельзя было расширить до пути к домашнему каталогу текущего пользователя.
В любом случае, $1
нужно заключать в двойные кавычки, если вы используете его с echo
(, если только вы не хотите, чтобы глобусы оболочки были расширены до имен файлов ), и в идеале команда должна быть написана сprintf
(это позволяет избежать интерпретации начального тире в $1
как начала некоторой опции для echo
,и позволяет избежать интерпретации определенных последовательностей обратной косой черты при некоторых обстоятельствах):
comm=$( printf '%s\n' "$1" | tr '~' ' ' )
Связанные:
Вы можете использовать замену процесса и 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