Я обычно делаю:
tar -czvf my_directory.tar.gz my_directory
Что если я просто хочу включить все (включая любые скрытые системные файлы) в my_directory, но не сам каталог? Я не хочу
my_directory
--- my_file
--- my_file
--- my_file
Я хочу:
my_file
my_file
my_file
tar -czf
? В моем случае это только хранение файлов, а не каталог. Когда я простоtar
каталог, он включает его, но сtar -czf
ним только добавление файлов.Ответы:
должен делать работу в одну строку. Это хорошо работает и для скрытых файлов. «*» не раскрывает скрытые файлы путем расширения имени пути, по крайней мере, в bash. Ниже мой эксперимент:
источник
.
на*
так, команда будет,cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
тогда она будет работать, как вы ожидали.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
входить в каталоги и выходить довольно неубедительно. Мог бы по крайней мере использовать,pushd
иpopd
еслиtar
не было никаких флагов, как-C
.Используйте
-C
переключатель tar:Команда
-C my_directory
tar сообщает об изменении текущего каталогаmy_directory
, а затем.
означает «добавить весь текущий каталог» (включая скрытые файлы и подкаталоги).Убедитесь, что вы делаете,
-C my_directory
прежде чем вы делаете,.
иначе вы получите файлы в текущем каталоге.источник
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
« apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Я всегда стараюсьtar -czvf my_directory.tar.gz * -C my_directory
и это не работает.-C
местоположение важно! Черт возьми ...*
не будет включать скрытые файлы (что было первоначальным требованием).Вы также можете создать архив как обычно и распаковать его:
источник
--strip-components
это расширение GNU.Посмотрите на
--transform
/--xform
, это дает вам возможность поменять имя файла при добавлении файла в архив:Выражение преобразования аналогично выражению of
sed
, и мы можем использовать разделители, отличные от/
(,
в приведенном выше примере).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
источник
file list too long
. Мое решение предотвращает это и является более гибким.--xform
несколько раз для нескольких путей.TL; DR
С некоторыми условиями (архивировать только файлы, директории и символические ссылки):
объяснение
Ниже, к сожалению, включает в себя родительский каталог
./
в архиве:Вы можете переместить все файлы из этого каталога, используя
--transform
опцию конфигурации, но это не избавляет от самого.
каталога. Приручать команду становится все труднее.Вы можете использовать
$(find ...)
для добавления списка файлов в команду (как в ответе Магнуса ), но это может привести к ошибке «список файлов слишком длинный». Лучший способ - объединить его с-T
опцией tar , например так:По сути, он выводит список всех файлов (
-type f
), links (-type l
) и подкаталогов (-type d
) в вашем каталоге, устанавливает относительное использование всех имен файлов-printf "%P\n"
, а затем передает их команде tar (она берет имена из STDIN с использованием-T -
).-C
Опция необходима , так деготь знает , где файлы с относительными именами расположены.--no-recursion
Флаг так , чтобы смола не рекурсии в папки Рассказываются в архив (порождение дубликатов файлов).Если вам нужно сделать что-то особенное с именами файлов (фильтрация, следующие символические ссылки и т. Д.),
find
Команда довольно мощная, и вы можете проверить это, просто удаливtar
часть вышеуказанной команды:Например, если вы хотите фильтровать файлы PDF, добавьте
! -name '*.pdf'
Не GNU найти
Команда использует
printf
(доступно в GNUfind
), которая указываетfind
печатать свои результаты с относительными путями. Однако, если у вас нет GNUfind
, это работает, чтобы сделать пути относительными (удаляет родителей с помощьюsed
):источник
Этот ответ должен работать в большинстве ситуаций. Обратите внимание, однако, как имена файлов хранятся в файле tar как, например,
./file1
а не простоfile1
. Я обнаружил, что это вызывает проблемы при использовании этого метода для манипулирования тарболами, используемыми в качестве файлов пакетов в BuildRoot .Одним из решений является использование некоторых глобусов Bash для вывода списка всех файлов, кроме
..
следующих:Это трюк, который я узнал из этого ответа .
Теперь tar вернет ошибку, если не найдено ни одного файла, соответствующего
..?*
или.[^.]*
, но он все равно будет работать. Если ошибка является проблемой (вы проверяете успех в сценарии), это работает:Хотя сейчас мы работаем с параметрами оболочки, мы можем решить, что лучше иметь
*
совпадающие скрытые файлы:Это может не сработать, если ваша оболочка перемещается
*
в текущем каталоге, поэтому в качестве альтернативы используйте:источник
tar: start.sh: Cannot stat: No such file or directory
Это происходит со всеми файлами в моем текущем каталоге! Как мне избежать этого?источник
Если это система Unix / Linux, и вы заботитесь о скрытых файлах (которые будут пропущены *), вам нужно сделать:
Я не знаю, как выглядят скрытые файлы под Windows.
источник
Я бы предложил следующую функцию Bash (первый аргумент - путь к каталогу, второй аргумент - базовое имя результирующего архива):
Вы можете запустить его таким образом:
и он сгенерирует архив
my_archive.tar.gz
в текущем каталоге. Он работает со скрытыми (. *) Элементами и с элементами с пробелами в имени файла.источник
Этот работал для меня, и он включает все скрытые файлы, не помещая все файлы в корневой каталог с именем "." как в ответе Томоэ :
источник
Пример:
Добро пожаловать.
источник
Это то, что работает для меня.
Вы также можете использовать
В первой команде find возвращает список файлов и подкаталогов my_dir . Однако каталог my_dir сам по себе включен в этот список как «.» -printf удаляет полный путь, включая этот «.» а также всеCRLF Однако пространствов строке формата «% Р» из PRINTF оставляет остатка в списке файлов и подкаталогов my_dir и можно увидеть на ведущих пространстве в результате находят команды.
Это не будет проблемой для TAR, но если вы хотите это исправить, добавьте -mindepth 1, как во второй команде.
источник
Пакс.
Pax - устаревший пакет, но делает работу отлично и просто.
источник
Самый простой способ, который я нашел:
cd my_dir && tar -czvf ../my_dir.tar.gz *
источник
Безопасно обрабатывает имена файлов с пробелами или другими необычными символами. При желании вы можете добавить
-name '*.sql'
или подобный фильтр к команде поиска, чтобы ограничить количество включаемых файлов.источник
Если папка mytemp, то, если вы примените вышеизложенное, она заархивирует и удалит все файлы в папке, но оставит ее в покое.
Вы можете задать шаблоны исключений, а также указать, что не следует просматривать вложенные папки.
источник
источник