Tar помещает дополнительную обратную косую черту перед каждой обратной косой чертой в bash

#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