Проблема получения bash для передачи переменной с пробелами в качестве одного имени файла в tar - PullRequest
0 голосов
/ 21 января 2019

Бьется головой об стену с этим. Я использую сценарий bash для чтения файла имен каталогов (по одному имени в строке, без экранированных символов) в переменную и использую эту переменную для вызова tar в этих каталогах. Если в одном из каталогов есть пробел, я не могу правильно передать его в tar (продолжает разделять его на два отдельных элемента, не сохраняя экранирование, которое я добавляю). Я попробовал много вариантов этого, но ниже это самый актуальный. Действительно разочаровывающая часть: echo показывает, что команда принимает точную форму, которую я ожидал, и работает, которая работает вручную, как и ожидалось. Заранее спасибо за помощь.

скрипт bash

#!/bin/bash

#build list of directories to backup from backup_dirs.txt
BACKUP_DIRS=
while read dir; do
    #create escaped version of string to handle spaces, etc...
    esc_line=$(printf '%q' "${dir}")

    echo "###### adding dir '${esc_line}'"

    #add new dire to list
    BACKUP_DIRS=${BACKUP_DIRS}\ "${esc_line}"
done < backup_dirs.txt


echo tar -cjvPf backup.tar.bz2 ${BACKUP_DIRS}

#run backup    
tar -cjvPf backup.tar.bz2 ${BACKUP_DIRS}

образец содержимого backup_dirs.txt

my_stuff
My Stuff

наблюдаемый результат

###### adding dir 'my_stuff'
###### adding dir 'My\ Stuff'
tar -cjvPf backup.tar.bz2 my_stuff My\ Stuff
my_stuff/
tar: My\\: Cannot stat: No such file or directory
tar: Stuff: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

1 Ответ

0 голосов
/ 21 января 2019

Я бы использовал mapfile, чтобы прочитать backup_dirs.txt в массив bash:

    mapfile -t BACKUP_DIRS <backup_dirs.txt

и затем передать его tar следующим образом:

    tar -cjvPf backup.tar.bz2 "${BACKUP_DIRS[@]}"

Если у вас много резервных каталогов, я бы рекомендовал использовать параметр командной строки -T, чтобы указать текстовый файл напрямую:

    tar -cjvPf backup.tar.bz2 -T backup_dirs.txt
...