LinuxForum.Fans
Тема

Как решить? tar exclude-from file

Автор: jimmy 10 сообщений 5577 просмотров
#256637

Есть некий каталог "/A", содержащий:

text

1/a.txt
1/b.txt.gz
1/c.txt
2/a.txt
2/b.txt.gz
2/c.txt

Есть некий файл exclude.txt, содержащий:

text
/A/1/b.txt.gz

Необходимо создать архивы 1.tar.gz, 2.tar.gz
Но при этом, чтобы файлы из exclude.txt не архивировались, а просто пропускались

Т.е. на выходе должно быть два архива:
1.tar.gz, содержащий:

text

a.txt
c.txt

2.tar.gz, содержащий:

text

a.txt
b.txt.gz
c.txt

Запускаем команду:

text

for i in $(ls /A); do
tar --exclude-from exclude.txt -cvzf $i.tar.gz $i
done

На выходе получается, что файл из exclude.txt архивируется, как и все остальные.

Можно конечно сделать так:

text

for i in $(ls /A); do
tar --exclude-from exclude.txt -cvzf $i.tar.gz /A/$i
done

Но при этом в архиве будет родительский каталог "A", а мне это не нужно.

Как быть?

#256645
text
--exclude={"/path/to/exclude0.txt","/path/to/exclude1.txt"}

Не?

#256646
"jimmy" написал:
Как быть?

убрать из exclude.txt все "/A/"

#256651

К сожалению не могу, т.к. есть B, C, D...
это маленький кусочек только представлен
И файл exclude.txt большой, там нет возможности что-то править

#256660
"jimmy" написал:
И файл exclude.txt большой, там нет возможности что-то править

тогда придётся формировать временные файлы. что-то вроде:

text

TEMP_EXCLUDE=$(mktemp)
sed -n '/^\/A\//{s///;p}' exclude.txt >${TEMP_EXCLUDE};
for i in $(ls /A); do
  tar --exclude-from ${TEMP_EXCLUDE} -cvzf $i.tar.gz $i
done
rm ${TEMP_EXCLUDE}
#256783

Fat-Zer, спасибо!

Я правда думал найдется более простой вариант с помощью ключа какого-нибудь.
Хотя ман перечитал вдоль и поперек, но его не нашел.

#256784

А если забыть про TAR.
Можно сделать что-то подобное с другим архиватором?
Чтобы "эксклюдил" по полному пути, а архивировал только объект.

#256826

Как вариант скармливать find'у со своими условиями, получить список, и архивировать его.

#256827

Хорошая мысль. Спасибо, буду думать.

#257137

Короче сделал следующим образом:
1. Сохраняем текущий путь
2. Переходим в нужный каталог (A,B,C...)
3. Формируем новый временный файл, в который заливаем exclude.txt, за исключением тех строк, которые не соответствуют текущему пути. И далее удаляем начало пути в этом временном файле.
4. Архивируем с указанием не архивировать файлы из временного файла
5. Удаляем временный файл
6. Переходим в начальный каталог

Вроде бы все работает отлично. Всем спасибо!

Войдите или зарегистрируйтесь, чтобы ответить.