3

Я пытаюсь создать файл .tar в Cygwin:

find . > tmpfilelist
tar -cf tmp.tar -T tmpfilelist

но когда я открываю tmp.tar в Windows с 7-Zip, каждый файл имеет четыре экземпляра:

Name              Size            Link
.gitignore        62
.gitignore        0               path/to/.gitignore
.gitignore        0               path/to/.gitignore
.gitignore        0               path/to/.gitignore

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

Можно ли создать в Cygwin файл .tar, который будет вести себя в Windows? Просто чтобы уточнить, я использую только файлы .gitignore в качестве примера; проблема, кажется, со всеми файлами.

Редактировать:

$ tar -tvf tmp.tar | grep -i "link to" | grep -i ".gitignore" | sort | head -n20
hrw-r--r-- user/None        0 2011-07-06 11:27 path/to/.gitignore link to path/to/.gitignore
hrw-r--r-- user/None        0 2011-07-06 11:27 path/to/.gitignore link to path/to/.gitignore
hrw-r--r-- user/None        0 2011-07-06 11:27 path/to/.gitignore link to path/to/.gitignore
hrw-r--r-- user/None        0 2011-09-29 15:40 path/to/other/.gitignore link to path/to/other/.gitignore
hrw-r--r-- user/None        0 2011-09-29 15:40 path/to/other/.gitignore link to path/to/other/.gitignore
hrw-r--r-- user/None        0 2011-09-29 15:40 path/to/other/.gitignore link to path/to/other/.gitignore
...

,

$ grep -i ".gitignore" tmpfilelist | sort | head -n20
path/to/.gitignore
path/to/other/.gitignore
...

tar Cygwin в показывает тот же список, но tmpfilelist не появляется , чтобы эти дополнительные ссылки. Поэтому я думаю, что реальный вопрос в том, как сделать красиво сформированный tar-файл в Cygwin? Я не уверен, имеют ли они отношение или как применять параметры tar - --dereference и --hard-dereference .

Редактировать: Насколько я знаю, 7z не сохраняет структуры каталогов, когда предоставляется список файлов без указания корня, и нет общего корня для некоторых файлов в моем списке (список в конечном итоге будет агрегирован для нескольких выполнений find ).

1 ответ1

2

Одной из проблем может быть то, что find . > tmpfilelist перечисляет как файлы, так и каталоги.

tar анализирует tmpfilelist и добавляет любой указанный каталог в файл tar с его содержимым.

tar также добавляет любой файл, указанный в tmpfilelist , но эти файлы уже были добавлены tar когда он обрабатывал каталоги. В результате файлы включаются более одного раза (в конце концов, много раз, если файлы находятся глубоко в структуре каталогов).

Вы должны использовать:

find . ! -type d > tmpfilelist

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

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

РЕДАКТИРОВАТЬ: символические ссылки могут уже существовать. Перечислите их с помощью find . -type l .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .