Я создаю 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 извлечениебез -P
yields 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|^/*||' …
Это удалит все начальные слеши.