#bash #shell #tar
#bash #оболочка #tar
Вопрос:
У меня есть массив, $files
который содержит адреса файлов, которые я хочу объединить вместе. Я делаю это так: tar czf "output.tgz" "${files[@]}"
. Все это работает до тех пор, пока не появится файл с пробелами в его имени. Для этого я использую path="${path// /' '}"
which заменяет все <space>
на <space>
, и после этого я добавлю его вот так files =("<space>$path");
в $files
массив.
Когда я пытаюсь сделать это с помощью всего лишь одного вызываемого тестового файла main and space.c
, $files
значение правильно установлено на: /home/tom/Desktop/main and space.c
когда я вызываю echo "Files array looks like this: $files"
непосредственно перед запуском, но когда программа переходит к запуску в следующей строке, я получаю сообщение об ошибке:
tar: /home/tom/Desktop/main\ и \ space.c: Невозможно указать: нет такого файла или каталога
Могу ли я заставить tar избегать размещения там дополнительных обратных косых черт?
Комментарии:
1. Добавьте вывод
declare -p files
к вашему вопросу (без комментариев).2. Вам не нужно этого делать. Цель массива — безопасно обрабатывать списки значений, которые сами содержат пробелы.
files=("foo bar" "hello word"); tar czf "output.tgz" "${files[@]}"
уже должен быть создан архивный архив, содержащий два файлаfoo bar
иhello world
.3. Это не tar добавлял дополнительные обратные косые черты, это вы делали
path="${path// /' '}"
4. @chepner FML! Вы правы. Я забыл о дополнительном пространстве перед адресом, который я туда помещал…………..
Ответ №1:
В первую очередь вы боретесь со своим массивом. Просто добавьте в массив имена, заключенные в правильные кавычки; оболочка обработает содержимое массива за вас.
$ files=()
$ files =("test 1.txt")
$ files =("test 2.txt")
$ files =("test 3.txt" "test 4.txt")
$ tar czf output.tgz "${files[@]}"
$ tar tzf output.tgz
test 1.txt
test 2.txt
test 3.txt
test 4.txt