колотите .tar создание

Я пытаюсь создать .tar.gz с файлами или каталогами в параметрах, чтобы сделать резервное копирование.

Однако, когда я создаю архив .tar.gz, у меня есть эта ошибка:

tar: path_directory_1: cannot stat: No such file or directory
tar: path_directory_2 : cannot stat: No such file or directory
tar: Stopped with failed status due to previous errors 

Как я создал архив:

tar zcvf $dirbackup/backup-$backupDate.tar.gz $string

где string :

old_IFS=$IFS

IFS=$'\n'

string="";

for line in $(cat $1); do

      string="$string $line"

done

IFS=$old_IFS

$1: файл с каталогом путей и файл путей для сохранения.

Exemple $1 содержание (просто каталоги соединяет каналом для сохранения):

~/Documents/MIAGE/L3/semestre5/web
~/Documents/MIAGE/L3/semestre5/communication/

Результат с набором-x:

+ tar zcvf /var/backups/mesbackups/backup-09-11-2016-13-58/backup-09-11‌​-2016-13-58.tar.gz '~/Documents/MIAGE/L3/semestre5/web' '~/Documents/MIAGE/L3/semestre5/communication/'
tar: ~/Documents/MIAGE/L3/semestre5/web : cannot stat : No such file or directory 
tar: ~/Documents/MIAGE/L3/semestre5/communication : cannot stat : No such file or directory 
tar: Stopped with failed status due to previous errors 

Когда я выполняю эту команду в оболочке, это - работа...

tar zcvf /var/backups/mesbackups/test/backup-09-11‌​-2016-13-58.tar.gz ~/Documents/MIAGE/L3/semestre5/web ~/Documents/MIAGE/L3/semestre5/communication/ 

Как я могу сделать со своим сценарием? Это кажется работой без quots нет?

0
задан 9 November 2016 в 23:24

2 ответа

Анализ

Рассмотрение входных примеров файла

~/Documents/MIAGE/L3/semestre5/web
~/Documents/MIAGE/L3/semestre5/communication/

и сообщения об ошибках от tar

tar: ~/Documents/MIAGE/L3/semestre5/web : cannot stat : No such file or directory
tar: ~/Documents/MIAGE/L3/semestre5/communication : cannot stat : No such file or directory

Вы, кажется, предполагаете что или интерпретатор оболочки или tar развернет тильду (~) при чтении его строк с любой из следующих конструкций:

  • for i in $(cat infile)
  • while read i; do ...; done < infile
  • mapfile ... < infile

Это предположение является ложью. Ни один из общих интерпретаторов оболочки не выполняет расширение или более конкретно расширение тильды в них ситуация. Это только оценивает escape-последовательности (см. read). Нет известный (мне) реализация tar выполняет расширение аргумента любой (и оно не было должно начиная с этого создавать много проблем).

Решение

Необходимо развернуть символы тильды во входных файлах так или иначе.

Самый легкий путь состоит в том, чтобы, вероятно, изменить входной файл вручную или с фильтром (если можно быть уверены это $HOME не включает sedсимволы ESC или символы-разделители (здесь \ и ;)):

sed -e 's;^~\(\/\|$\);'"$HOME"'\1;' infile | tar cvzf my-archive.tar.gz --from-file -

Если Вы хотите использовать в своих интересах все доступные расширения оболочки и можете гарантировать, что надлежащий вход, выходящий из Вас, может использовать eval встроенная команда:

while read -r i; do
  eval echo "$i"
done < infile |
tar cvzf my-archive.tar.gz --from-file -
0
ответ дан 28 September 2019 в 05:21

Если $1 название файла, содержащего список файлов, чтобы добавить к архиву, один на строку, то необходимо смочь просто использовать эти --files-from FILE форма tar

tar zcvf "$dirbackup"/backup-"$backupDate".tar.gz --files-from "$1"

, Если Вы не можете использовать --files-from по некоторым причинам, то следующий наилучший вариант состоит в том, чтобы, вероятно, использовать массив удара

mapfile -t files < "$1"

tar zcvf "$dirbackup"/backup-"$backupDate".tar.gz "${files[@]}"

, хотя это может иметь проблемы, если количество файлов в $1 является очень большим.

1
ответ дан 28 September 2019 в 05:21

Другие вопросы по тегам:

Похожие вопросы: