Как мне извлечь только файлов из каталога в tar-архиве? Мне нужно извлечь все файлы в каталоге, а не конкретные файлы. Например, с tar-архивом такой структуры:
wordpress
--wp-admin
--wp-content
--wp-includes
--index.php
--license.txt
--readme.html
Я хочу извлечь только 3 (или более) файла из каталога wordpress, а не из подкаталогов.
Обратите внимание, что другие решения, которые я мог найти на этом сайте, касаются извлечения определенных файлов. Мой вопрос касается извлечения всех файлов.
Если я не могу сделать предположение о формате имен каталогов и имен файлов, я не могу найти способ извлечения файлов на определенном уровне без извлечения (пустых )каталогов на том же уровне. (Если имена файлов содержат точку, а каталоги — нет, то другого ответа будет достаточно.)
Рассмотрим 370358.tar
с таким содержанием
wordpress/
wordpress/index.php
wordpress/license.txt
wordpress/readme.html
wordpress/wp-admin/
wordpress/wp-admin/admin.php
wordpress/wp-content/
wordpress/wp-content/2021/
wordpress/wp-content/2021/01/
wordpress/wp-content/2021/01/19/
wordpress/wp-content/2021/01/19/today.txt
wordpress/wp-content/content.txt
wordpress/wp-content/here.txt
wordpress/wp-content/some.txt
wordpress/wp-includes/
Вы можете извлечь файлы, соответствующие wordpress/*
, следующим образом
tar xf /tmp/370358.tar --wildcards --exclude '*/*/*' && rmdir */* 2>/dev/null
ls -R wordpress
wordpress:
index.php license.txt readme.html
Обратите внимание на замыкающий rmdir
. Мы не можем сказать tar
пропустить создание каталога, даже если результирующие каталоги будут пустыми, поэтому мы просто удаляем их впоследствии.
Если вы не хотите, чтобы каталог wordpress
включался в извлечение,
tar xf /tmp/370358.tar --strip-components 1 --wildcards --exclude '*/*/*' && rmdir * 2>/dev/null
ls -R
.:
index.php license.txt readme.html
Это извлечет все файлы из каталога в tar-файл, не заходя в подкаталоги:
tar --wildcards --no-wildcards-match-slash -xvf file.tar.gz directory_in_tar/*.*
Я мог видеть, что на этот вопрос уже был дан ответ/опубликовано по следующей ссылке:
Предполагая, что GNU tar
, вы можете извлечь архив с помощью короткого bash
скрипта:
tar -x -f archive.tar --to-command=./script.sh
... где script.sh
— исполняемый скрипт
#!/bin/bash
if [ "$TAR_FILETYPE" = f ] &&
[[ $TAR_FILENAME == wordpress/* ]] &&
[[ $TAR_FILENAME != wordpress/*/* ]]
then
mkdir -p "${TAR_FILENAME%/*}" &&
cat >"$TAR_FILENAME" &&
chmod "$TAR_MODE" "$TAR_FILENAME" &&
chown "$TAR_UNAME:$TAR_GNAME" "$TAR_FILENAME" || true
else
cat >/dev/null
fi
Используемые здесь TAR_*
переменные устанавливаются GNU tar
в среде скрипта, а данные извлекаемого в данный момент файла поступают через стандартный ввод.
Тесты, используемые в сценарии, должны убедиться, что
wordpress
и больше нигде. Чтобы извлечь файл, мы просто убеждаемся, что каталог файла существует, перенаправляем стандартный ввод на правильное имя файла, а затем изменяем режим файла и владельцев, чтобы права и владельцы были правильными.
Очевидно, вы также можете указать скрипт в строке -в командной строке tar
:
tar -x -f archive.tar --to-command='bash -c "
if [ \"\$TAR_FILETYPE\" = f ] &&
[[ \$TAR_FILENAME == wordpress/* ]] &&
[[ \$TAR_FILENAME != wordpress/*/* ]]
then
mkdir -p \"\${TAR_FILENAME%/*}\" &&
cat >\"\$TAR_FILENAME\" &&
chmod \"\$TAR_MODE\" \"\$TAR_FILENAME\" &&
chown \"\$TAR_UNAME:\$TAR_GNAME\" \"\$TAR_FILENAME\" || true
else
cat >/dev/null
fi"'