1

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

tar -czf $ARCHIVE_NAME -C $DIR .

создаст архив вроде

./package.json
./.git
./.gitignore
.
.
.

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

package.json
.git
.gitignore
.
.
.

Как я могу это сделать?

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

Изображение ниже может быть полезным для разъяснения этого вопроса.

  • Слева - архив, созданный с помощью инструмента GUI проекта (два дня назад).
  • Справа - архив, созданный с помощью указанной выше команды tar .

Обратите внимание на панель "Расположение"; архив справа должен быть / , а не /./ .

3 ответа3

3

./ означает текущий каталог. Ваши два списка идентичны.

Наличие ./ перед файлом при выводе архива помогает обрабатывать файлы со специальным именем. Имя файла -file будет отображаться как ./-file что позволяет обрабатывать его вторым инструментом.

1

Изменение вашей команды от

tar -czf $ARCHIVE_NAME -C $DIR .

в

tar -czf $ARCHIVE_NAME -C $DIR ./*

должен сделать свое дело. Таким образом, вы не говорите «Добавить каталог . В архив», а вместо этого «Добавить все эти файлы в каталог . В архив».

0

Эта команда заархивирует файлы в текущем каталоге без ведущего ./:

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

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