извлечь файлы по относительному пути из tar-файла, созданного с флагом -P

извлечь файлы по относительному пути из tar-файла, созданного с флагом -P

Я создаю tar-файл с помощью -Pфлага, что означает, что все пути являются абсолютными ( /из имен файлов начальные символы не удаляются). Я использую его, поскольку я архивирую несколько каталогов и мне нужно, чтобы каждый файл извлекался в правильное место.

Я использую скрипт для извлечения tar-файла, и мне нужна возможность извлекать файлы в другой каталог, если указан необязательный аргумент.

Я создаю tar-файл следующим образом:

tar pcjfPv "${ARCHIVE_NAME}".tmp.bz  ${DIR_A} ${DIR_B}

${DIR_A}есть /path/aи ${DIR_B}есть /path/b.

Если я выполню скрипт извлечения без аргументов, я ожидаю, что файлы попадут в правильные каталоги. Эта часть работает, как и ожидалось, с tar mxfvjpP.

Однако когда скрипт получает путь в аргументе, я хочу извлечь файлы в /path/from/argument/path/aи /path/from/argument/path/b.

Возможно ли это вообще? Вот что у меня сейчас:

if [ ! -d "${EXTRACT_TO}" ]; then
    echo "${EXTRACT_TO} does not exist, creating."
    mkdir -p ${EXTRACT_TO}
fi
tar mxfvjP - -C ${EXTRACT_TO}

Это не работает. Путь в ${EXTRACT_TO}создан, но файлы все равно извлекаются в /path/aи /path/b.

ПРИМЕЧАНИЕ: Я не могу изменить tar-файл.

решение1

В моем Debian извлечениебез -Pyields Removing leading '/' from member names. Возможно, все, что вам нужно, это не использовать -Pпри извлечении в другой каталог.


Если есть какие-либо проблемы с вышеуказанным подходом, рассмотрите --transform. От man 1 tar:

--transform=EXPRESSION, --xform=EXPRESSION
Используйте sedзамену EXPRESSIONдля преобразования имен файлов.

Так что это

tar -x --transform='s|^/||' …

удалит один начальный слеш (если он есть) из каждого пути. Но поскольку////fooэквивалентно/foo, следующее кажется лучше:

tar -x --transform='s|^/*||' …

Это удалит все начальные слеши.

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