Пытаюсь заменить пробелы на бекслеш с пробелом, и сед/авк/тр (все пробовал) добавляет какие-то странные апострофы в переменные, и соответственно никакие программы не понимают это как путь к чему-то.
Не плюйся сразу, но ты б лучше написал тут простой и короткий пример. Ведь вопрос по sed/awk/tr? Вот и не заставляй читателей ковырятся в поисках *вопроса*.
>> Теперь все ньюлайны поменялись на \n
Я смысл всего скрипта не понял, но вы тиам много чего делаете через
одно место. Допустим есть программа cmd, которая на stdout выдаёт
имена файлов, один файл - одна строка. Тогда:
cmd | while read file_name; do
chmod 0123 "$file_name"
done
Кстати проще ИМХО не пытаться парсить вывод unzip, а просто после распаковки пройтись по $OUTDIR find'ом и сделать всё что нужно. Если в $OUTDIR уже что-то есть, то лучше распаковку выполнить в другой каталог (где-нибудь в недрах /var/tmp например), сделать со свежераспаковынными файлами всё что нужно и потом переместить их куда надо.
>> Там есть, и есть это OUTDIR="/" :) Сто процентов - через задницу
Тогда да, самый простой и правильный (опять ИМХО =)) способ - распаковывать во временную папку, обрабатывать и затем mv'ать на постоянное место жительства. Кстати примерно так работает emerge - система управления пакетами в Gentoo Linux.
В случае с сабжевым скриптом по ссылке этот вариант не подошёл бы, так как unzip кроме имён файлов ещё всякий хлам выдаёт. А внутри цикла его проще отсеивать.
> cmd | xargs chmod 0123
этот вариант не заботится о пробелах вообще
>cmd | while read file_name; do
> chmod 0123 "$file_name"
>done
а этот не заботится о пробелах в начале имени.
cmd | tr \\n \\0 | xargs -0 chmod 0123