
Я пытаюсь архивировать папку проекта со скрытыми файлами и папками, и получаю одну с корневой записью .
. Это раздражает. Обычно :
tar -czf $ARCHIVE_NAME -C $DIR .
создаст архив вроде
./package.json
./.git
./.gitignore
.
.
.
где я хотел бы, чтобы корнем архива были реальные файлы и папки, не имеющие .
записи. Например
package.json
.git
.gitignore
.
.
.
Как мне это сделать?
* Редактировать *
Изображение ниже может помочь прояснить этот вопрос.
- Слева — архив, созданный с помощью графического инструмента проекта (два дня назад).
- Справа — архив, созданный с помощью указанной выше
tar
команды.
Обратите внимание на строку «Расположение»; архив справа должен быть /
, инет /./
.
решение1
./
означает текущий каталог. Ваши два листинга идентичны.
Наличие ./
перед файлом при перечислении архива помогает обрабатывать файлы со специальным именем. Имя файла -file
будет отображаться как ./-file
разрешающее его обработку вторым инструментом.
решение2
Изменение вашей команды с
tar -czf $ARCHIVE_NAME -C $DIR .
к
tar -czf $ARCHIVE_NAME -C $DIR ./*
Должно сработать. Таким образом, вы не говорите «Добавить каталог .
в архив», а вместо этого «Добавить все эти файлы в каталоге .
в архив».
решение3
Эта команда заархивирует файлы в текущем каталоге без начального ./
:
tar cf /some/tarfile.tar *
Конечно, он не будет включать имена файлов, начинающиеся с точки, что, вероятно, не то, что вам нужно. Вы можете добавить дополнительные подстановочные знаки, чтобы поймать их:
tar cf /some/tarfile.tar * .[a-zA-Z]*
Но это не универсальное решение: вам нужно знать имена файлов в каталоге, чтобы можно было создать соответствующие подстановочные знаки.
GNU tar, который используется в большинстве дистрибутивов Linux, имеет функцию преобразования имен файлов с использованием sed
выражений. Это удалит ./
из файлов при создании архива:
tar cf /some/tarfile.tar --transform 's,^\./,,' .
Полученный архив по-прежнему будет содержать запись для самого каталога «.».
Некоторые версии tar
могут считывать имена файлов, которые нужно заархивировать из файла. Вы можете использовать эту функцию, чтобы сделать следующее:
ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin
Этот конвейер создает список всех файлов в текущем каталоге, удаляет записи .
и ..
и передает оставшиеся имена в tar
. tar создает архив из имен файлов, считанных из /dev/stdin
(его стандартный ввод).