1

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

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

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

/A/1/b.txt.gz

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

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

a.txt
c.txt

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

a.txt
b.txt.gz
c.txt


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

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

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

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

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

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

Как быть?

2 (04.06.2012 18:24:58 отредактировано zenon)

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

Не?

История показывает, что во всем новом обычно кроется какой-то подвох.
Классическая ошибка, которую совершают проектировщики
абсолютно надежных систем, - недооценка изобретательности клинических идиотов.

3

jimmy пишет:

Как быть?

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

95% процентов проблем находятся между клавиатурой и стулом.

4 (04.06.2012 18:37:40 отредактировано jimmy)

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

5

jimmy пишет:

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

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

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}
95% процентов проблем находятся между клавиатурой и стулом.

6 (05.06.2012 12:16:06 отредактировано jimmy)

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

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

7

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

8

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

История показывает, что во всем новом обычно кроется какой-то подвох.
Классическая ошибка, которую совершают проектировщики
абсолютно надежных систем, - недооценка изобретательности клинических идиотов.

9

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

10

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

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