Создать архив со скрытыми файлами и папками, создать . root запись

Создать архив со скрытыми файлами и папками, создать . root запись

Я пытаюсь архивировать папку проекта со скрытыми файлами и папками, и получаю одну с корневой записью .. Это раздражает. Обычно :

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(его стандартный ввод).

Связанный контент