Я пытаюсь создать .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 нет?
Рассмотрение входных примеров файла
~/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 -
Если $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
является очень большим.