Как мне удалить полный путь при выполнении сжатия tar.gz?
Я использую эту команду для архивации каталога с именем g
из кода Java:
tar czf /a/b/c.tar.gz /e/f/g
Когда файл tar c.tar.gz
создан, я нахожу весь путь e/f/g
тогда все файлы g
папка внутри него. Но я хочу видеть только файлы в папке g
в сжатом архиве, когда я его открываю. Как мне удалить папки /e/f/
в файле.tar.gz?
3 ответа
tar -czf /a/b/c.tar.gz -C /e/f/g .
-C
вариант делает tar
изменить рабочий каталог, так что вам нужно только добавить .
,
Смотрите: Изменение рабочего каталога - GNU tar
руководство
Этот вопрос возник давно, но я до сих пор не мог легко найти для себя ответ на добавление файлов и папок с определенными критериями поиска и относительными путями.
Нижеследующее охватывает более широкую тему, чем то, что было задано. Итак, я пишу решение, которое придумал в результате своего исследования.
Давайте предположим, что ваш$input_dir
переменная указывает на интересующий вас каталог, и вы хотите заархивировать и сжать (с помощью gzip) все ваши*.txt
файлы в~/my_txt.tar.gz
. Чтобы создать gzip-архив без пути, сохраненного в tar (относительный путь), используйте следующее:
find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-
Давайте разберемся:
-
"$input_dir"
: Начальный каталог. Измените его на то, что вам нравится. -
maxdepth 1
: ищет только в корне этого каталога. Вы можете удалить или изменить его, если хотите выполнить поиск на всех или разных уровнях. -
-type f
: поиск только файлов -
-name "*.txt"
: соответствие критериям *.txt -
-printf "%P"
: вывести относительный путь (страница руководства: «Имя файла с именем начальной точки, в которой он был найден, удалено»). -
-printf "%P\0"
: null завершить вывод относительного пути -
| tar
: передать выходные данные следующей команде, которая здесь tar - : инструктирует последующие
--files-from
возможность читать имена, заканчивающиеся нулем. Помните, что мы просили создать завершающийся нулем (\0
) выходы вместо обычных завершенных выходов. Это необходимо для покрытия всех возможных имен файлов пробелами или другими специальными символами. -
--create
: создать файл tar. Равно-c
. -
--remove-files
: я использую эту опцию для удаления файлов после их добавления в архив. Вы можете бросить это. -
--gzip
: заархивируйте архив. Равно-z
. -
--file="$HOME/my_txt.tar.gz"
: Выходной файл tarball в формате gzip. Равно-f "$HOME/my_txt.tar.gz"
-
--directory="$input_dir"
: Это значит, что теперь происходит переход в этот каталог. Теперь он будет искать имена файлов, передаваемых в этом каталоге (помните, что мы указали относительный путь имен файлов к этой папке). Равно-C "$input_dir"
. -
--files-from=/dev/stdin
: Его общая форма--files-from=FILE
. Этот вариант с--null
Опция указывает, что имена разделяются символом ASCII NULL вместо перевода строки (\n
). Мы также говорим, что этоstdin
(по трубопроводу изfind
прямо кtar
вместо того, чтобы читать изFILE
на диске). Равно-T -
.
Некоторые из вышеперечисленных вариантов можно изменить на варианты одного символа и комбинировать.
find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -
Вы можете проверить список файлов, используя-t
или--list
вариант:
tar -tf "$HOME/my_txt.tar.gz"
Теперь, чтобы извлечь файлы в каталог $output_dir (который существует), используйте это:
tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"
The v
опция является подробной, и вы также можете добавить ее во время создания архива.
Ответ slhck не позволяет фильтровать файлы, которые нам нужны, и включает весь каталог, а подстановка оболочки не будет работать с этой опцией каталога (см. эту проблему, описанную здесь: Как заставить подстановку tar работать с опцией «изменить каталог» ).
Шахин г, ответ отличный, но нулевые байты помешали мне использовать команду на языке программирования, потому что нулевые байты запрещены в строке. Поэтому я адаптировал его для работы без нулевого байта, когда вам не нужно обрабатывать имена файлов с пробелами, ответьте здесь .
tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")
или
find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -