LINUX.ORG.RU

tar не может добавить файл в архив

 , , ,


0

1

Всем привет

Столкнулся с непонятным для меня поведением.

Вот есть скрипт:

IFS=$'\n'
path=/mnt/backup/some/dir
log_file=/tmp/arch.log
cmd=$(find $path -type f)
arch_name=arch_2016.tar.gz
arch_path=/mnt/backup/some/dir
arch_cmd (){
tar --use-compress-program=pigz -cpvf $arch_path$arch_name -T $log_file
}
echo "$cmd" > $log_file
arch_cmd
Его работа заключается в следующем: Ищет все файлы в нужном каталоге, добавляет список файлов в файл. Затем читая список файлов, архивирует их в указанный каталог. Путь к файлу - это сетевая шара cifs, в шаре есть скрытые файлы. Если запускать скрипт, то получаю много файлов, которые не могут добавиться в архив, и ругаются, вот так:
tar: /mnt/backup/some/dir/dir/dir/1405322438.M267333P29095.mail,S=6776,W=6932\:2,: Функция stat завершилась с ошибкой: Нет такого файла или каталога
Но в сетевой шаре такой путь есть. Как победить?

Ответ на: комментарий от crutch_master

Похоже, но у меня такой скрипт локально отработал нормально (с файлами, расположенными локально), магия с

IFS=$'\n'
нормально позволила все сделать. переноса строки разве мало будет?

Aborigen1020
() автор топика
Последнее исправление: Aborigen1020 (всего исправлений: 1)

Предлагаю переписать эту неочевидную Bash-портянку на нормальный язык программирования.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Aborigen1020

Вангую косяки при передачи аргументов в tar. Попробуй кавычки поставить вокруг $log_file что-ли. Ну и удваиваю переписывание хотя бы на пистоне. Сдался вам этот баш с такими кульбитами.

crutch_master ★★★★★
()
Ответ на: комментарий от Aborigen1020

скрипт локально отработал нормально

Ну так tar-ь локально, и лишь потом перекидывай в шару.

anonymous
()
Ответ на: комментарий от Aborigen1020

когда освою не менее нужный bash

Есть вероятность, что к тому времени, когда ты научишься мастерски расставлять 40 различных видов кавычек, «нужный» bash станет ещё более ненужным.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Есть вероятность

Математика - сила. Но я что-то пропустил. Ты что-то «вещественное», а не «вероятное» предложил?

anonymous
()
Ответ на: комментарий от Aborigen1020

неохота качать их туда-сюда

Чушь! Упаковка происходит на твой машине, а на удалённой. Просто source и target на удалённой, а упаковка на той, где tar запущен. Не обманывай себя!

anonymous
()
Ответ на: комментарий от anonymous

Конечно, но сделаю это в одном скрипте и с нужной нагрузкой - прочитал файл, добавил в архив, а не копируя весь объем сразу, занимая сеть, место локальное и пр

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

прочитал файл, добавил в архив

Т.е. сделать overlay.tar.gz из одного файла, а потом на-cat-ить его на удалённый архив не судьба?

anonymous
()

А кто будет писать слеш между путем до директории и именем файла архива? Получается какая-то дичь: $arch_path$arch_name -> /mnt/backup/some/dirarch_2016.tar.gz

lu4nik ★★★
()
Последнее исправление: lu4nik (всего исправлений: 1)
Ответ на: комментарий от Aborigen1020

еще не научила

Если нужна «картинка», вместо cat

cat overlay.tar.gz >> /хэ/знает/где/backup.tar.gz
пользуй pv
pv overlay.tar.gz >> /хэ/знает/где/backup.tar.gz

anonymous
()
Ответ на: комментарий от lu4nik

Ага, подловил!
Но на самом деле в скрипте у меня стоит / , и имя архива формируется корректно. Да и была бы ошибка на несуществующий файл? Он бы его создал по этому пути, на уровень выше просто.

Aborigen1020
() автор топика
Ответ на: комментарий от anonymous

что вообще предлагаете то? Сначала скачать 500гб по узкому каналу, сжать, и залить назад?

Так это можно и без всяких страшных вещей типа cat overlay.tar.gz >> /хэ/знает/где/backup.tar.gz делать.

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Сначала скачать 500гб по узкому каналу, сжать, и залить назад?

Не обманывай себя! Именно так твой скрипт и делает.

anonymous
()
Ответ на: комментарий от anonymous

и пусть делает, я не буду сидеть и ждать момента, когда весь объем сначала перекопируется мне локально + я ограничен в локальном пространстве на ЖД.
Не покупать более объемный жд - тоже самообман?

Aborigen1020
() автор топика
Ответ на: комментарий от anonymous

Именно так

кстати, нет, он одновременно вместе с чтением сжимает и пишет, а не сначала читает все, а потом пишет все

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

я ограничен в локальном пространстве на ЖД

А за-pipe-ить не плучится?:

cat "/хэ/знает/где/file.log" | tar -cz >> "/хэ/знает/где/backup.tar.gz"

anonymous
()
Ответ на: комментарий от anonymous

cat «/хэ/знает/где/file.log» | tar -cz

Более того. Вообще не pipe-тся.

anonymous
()
set -x

после шебанга и отлаживай сколько угодно.

А вообще, можно не монтировать cifs-шару, а использовать

smbclient -T

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

можно и сразу через

 bash -x script.sh 
Только и с этим не открывается, какие там могут еще экраны понадобиться?

а использовать smbclient -T

Чем это лучше?

Aborigen1020
() автор топика

dovecot переименовывает файлы при изменениях флагов письма.

между find и tar может пройти много времени.

Поясни зачем отдельно искать файлы ?

Если есть проблемы с именами файлов, то нужно использовать

find ... -type f -print0 | tar ... --null -T -
vel ★★★★★
()
Ответ на: комментарий от Aborigen1020

Только и с этим не открывается

Глазами посмотри, в чём косяк.

Чем это лучше?

Не надо монтировать cifs-шару, не нужен рут.

Deleted
()
Ответ на: комментарий от vel

я их начал искать через find, т.к. со стандартного вывода tar также не мог получить доступ к этим файлам, думал получу полный путь к файлу, а затем скормлю этот путь архиватору.

dovecot переименовывает файлы при изменениях флагов письма.

Зрите в корень. Но это старый maildir, ничем не пожатый. Dovecot туда сейчас не смотрит. Хочу сжать все это безобразие и почистить место на хранилище.

Aborigen1020
() автор топика
Ответ на: комментарий от vel

нужно использовать

Не очень получается и таким образом. Это без скрипта, просто в консоли запускать если.

tar: /mnt/backup.../140345823862.M593324421P14791.mail,S=1530,W=1562\:2,: Функция stat завершилась с ошибкой: Нет такого файла или каталога

Но файл то есть.

-rwxrwxrwx    1 admin    users         1530 Sep 23  2018 /volume1/Backup/.../140345823862.M593324421P14791.mail,S=1530,W=1562:2,

Кажется, неправильно оборачиваются запятые в названии файла. Пока единственная зацепка

Aborigen1020
() автор топика
Ответ на: нужно использовать от Aborigen1020

Пока единственная зацепка
/mnt/backup.../140345823862.M593324421P14791.mail,S=1530,W=1562\:2,
/volume1/Backup/.../140345823862.M593324421P14791.mail,S=1530,W=1562:2,

Ну хоть бы через diff прогнал бы, чтоле? Очков не надо, чтобы почувствовать разницу.

anonymous
()
Ответ на: комментарий от anonymous

Мда, куда лезешь то.
Тему прочитай, и пойми, что первое - это путь к файлу через cifs, а второе - локальный путь к этому же файлу на сетевой шаре.
Анонимус сегодня какой-то уставший.

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Анонимус сегодня какой-то уставший.

Да ну?:

stat /mnt/backup.../140345823862.M593324421P14791.mail,S=1530,W=1562\:2,
stat /volume1/Backup/.../140345823862.M593324421P14791.mail,S=1530,W=1562:2,
Чего непонятно то?

anonymous
()
Ответ на: комментарий от anonymous

Да ну?:

ну да. Стат и не покажет путь, который не существует, volume1/backup не существует на моей машине, на которой делаю архивацию.

можете еще про слэш в пути пытаться объясниться, но именно так я получаю список файлов, этот слеш подставляется чем-то. Теперь невнимательно читаю рассуждения анонима об ошибках в пути

Aborigen1020
() автор топика
Ответ на: комментарий от vel

А проблема только с этим файлом?

С большинством файлов. Можно и на хранилище запустить архивацию, и все архивируется, только времени займет это, видимо, очень много.

Aborigen1020
() автор топика
Последнее исправление: Aborigen1020 (всего исправлений: 1)
Ответ на: комментарий от Aborigen1020

Можно и на хранилище запустить архивацию

А зачем тебе tar?:

cd /хэ/знает/куда
gzip *

anonymous
()
Ответ на: комментарий от Aborigen1020

Дык взять все имя файла 1 раз в одинарные кавычки и не париться с экранированием отдельных символов.

stat '/mnt/backup.../140345823862.M593324421P14791.mail,S=1530,W=1562:2,'
stat '/volume1/Backup/.../140345823862.M593324421P14791.mail,S=1530,W=1562:2,'

vel ★★★★★
()
Ответ на: комментарий от vel

OK.

stat '/mnt/backup/.../140345823862.M593324421P14791.mail,S=325386,W=331082:2,'
stat: не удалось выполнить stat для '/mnt/backup/.../140345823862.M593324421P14791.mail,S=325386,W=331082:2,': Нет такого файла или каталога 


ls -lah /mnt/backup/.../140345823862.M593324421P14791.mail*
ls: '/mnt/backup/.../140345823862.M593324421P14791.mail,S=325386,W=331082:2,': Нет такого файла или каталога
-rwxrwxrwx 1 1024 users 318K сен 24  2018 /mnt/backup/.../140345823862.M593324421P14791.mail,S=325386,W=331082:2,

stat '/volume1/Backup/.../140345823862.M593324421P14791.mail,S=325386,W=331082:2,'
  File: "/volume1/Backup/.../140345823862.M593324421P14791.mail,S=325386,W=331082:2,"
  Size: 325386    	Blocks: 640        IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 16777675    Links: 1    
Access: (0777/-rwxrwxrwx)  Uid: ( 1024/   admin)   Gid: (  100/   users)
Access: 2018-09-24 01:38:31.000000000
Modify: 2018-09-24 01:38:31.000000000
Change: 2019-10-24 11:02:02.000000000
Aborigen1020
() автор топика

https://bugs.launchpad.net/ubuntu/ source/samba/ bug/676304

Ivan Kozik (ludios) wrote on 2017-09-26: #18
On xenial, I noticed that the Linux cifs client converts : to U+F022 (SFM_COLON) by default even when talking to a Samba with unix extensions. I think this happens in convert_to_sfm_char in linux's fs/cifs/cifs_unicode.c.

You can use the undocumented mount option «nomapposix» to turn off those character conversions, and then access to files with a colon works fine.

slowpony ★★★★★
()
Ответ на: комментарий от slowpony

Охренеть :)

Но на современных системах я не вижу проблемы с ':'. Ни с оффтопичным сервером, ни на самбой.

vel ★★★★★
()
Ответ на: комментарий от Aborigen1020

ну что, cifs-шара умерла ночью, видимо, от таких io, и все встало ракомколом.
Теперь у меня есть частичный архив.
Думаю получить имя предпоследнего файла в архиве, и найдя эту строку в файле $log_file, удалив предыдущие строки, запустить архивацию с уже измененным списком. Сработает жеж добавление в уже существующий архив?

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

сделал обрезку файла до нужной строки

sed '1,460586d' /tmp/arch_name.log

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

Aborigen1020
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.