Как программно получить имя файла или каталога после извлечения после tar-архива?

Предыдущие ответы (начиная с 20160611), обсуждающие уровни запуска, применимы только для версий Ubuntu с использованием Upstart. Ubuntu 16.04 переключился с выскочки на systemd. Для загрузки на консоль, а не на X, вам нужно изменить цель по умолчанию для загрузки с graphical на multi-user:

sudo systemctl enable multi-user.target --force
sudo systemctl set-default multi-user.target

Затем перезагрузитесь. Чтобы отменить это:

sudo systemctl set-default graphical.target

И затем перезагрузитесь.

3
задан 8 March 2018 в 18:41

6 ответов

Например:

$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1 ffmpeg-3.4.2-64bit-static

Обратите внимание, что GNU tar не требует -j, -z и т. д., он может автоматически обнаруживать тип архива.

0
ответ дан 17 July 2018 в 19:17
[D0] не делать. Вместо этого, чтобы tar поместил содержимое в выбранный вами каталог.

tar может удалить n компонентов пути каждого файла (--strip-components) tar может применять произвольные выражения sed для изменения путь к каждому файлу (--transform)

Итак, я сделал бы что-то вроде:

mkdir ffmpeg wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar --xz -x -C ffmpeg --strip-components=1

Здесь я сам сделал директорию и сказал, чтобы tar был там извлечен ( -C), удаляя первый компонент из пути извлеченных файлов. Таким образом, ffmpeg-3.4.1-64bit-static/ffprobe становится ffprobe внутри каталога ffmpeg.

Или:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar --xz -x --transform='s:[^/]*/:ffmpeg/'

Здесь я просто изменил первый компонент пути на ffmpeg, поэтому мне не нужно было создавать каталог самостоятельно. Таким образом, ffmpeg-3.4.1-64bit-static/ffmpeg становится ffmpeg/ffmpeg.

Или, зная, что вы специально хотите сбросить эти конкретные файлы в /usr/local/bin, используйте -C для непосредственного размещения файлов там, удаляя все компоненты каталога и выбирая именно те файлы, которые вы хотите извлечь:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar Jx -C /usr/local/bin --transform='s:.*/::' --wildcards '*/ffmpeg' '*/ffprobe'

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

3
ответ дан 17 July 2018 в 19:17

Команда для получения имени каталога из файла tar.xz:

tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'

Вам понадобится:

Получить имя каталога (например, используя вышеуказанное решение ) и сохраните его в переменной, распакуйте файл tar.xz (например, используя команду tar xf), переместите файлы с помощью переменной каталога

Объяснение, как получить имя каталога из tar file:

Параметры tar:

-f file -J xz compression -t list content -v verbose

head -1 - печатает строку файла

awk '{print $6}' - печатает 6-й элемент, который имя каталога

Примеры:

Получить имя каталога (например, используя вышеприведенное решение) и сохранить его в переменной [ ! d13]

Результаты с:

coreutils-8.22/ tar.bz2 пример для ffmpeg-3.4.2.tar.bz2 tar tjvf ffmpeg-3.4.2.tar.bz2 | head -1 | awk '{print $ 6}'

Результаты с:

ffmpeg-3.4.2/ Обратите внимание, что для сжатых файлов bz2 я использовал флаг tar j
0
ответ дан 17 July 2018 в 19:17

Например:

$ tar tf ffmpeg-release-64bit-static.tar.xz | head -1 | cut -d '/' -f1 ffmpeg-3.4.2-64bit-static

Обратите внимание, что GNU tar не требует -j, -z и т. д., он может автоматически обнаруживать тип архива.

0
ответ дан 23 July 2018 в 20:02
[D0] не делать. Вместо этого, чтобы tar поместил содержимое в выбранный вами каталог.

tar может удалить n компонентов пути каждого файла (--strip-components) tar может применять произвольные выражения sed для изменения путь к каждому файлу (--transform)

Итак, я сделал бы что-то вроде:

mkdir ffmpeg wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar --xz -x -C ffmpeg --strip-components=1

Здесь я сам сделал директорию и сказал, чтобы tar был там извлечен ( -C), удаляя первый компонент из пути извлеченных файлов. Таким образом, ffmpeg-3.4.1-64bit-static/ffprobe становится ffprobe внутри каталога ffmpeg.

Или:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar --xz -x --transform='s:[^/]*/:ffmpeg/'

Здесь я просто изменил первый компонент пути на ffmpeg, поэтому мне не нужно было создавать каталог самостоятельно. Таким образом, ffmpeg-3.4.1-64bit-static/ffmpeg становится ffmpeg/ffmpeg.

Или, зная, что вы специально хотите сбросить эти конкретные файлы в /usr/local/bin, используйте -C для непосредственного размещения файлов там, удаляя все компоненты каталога и выбирая именно те файлы, которые вы хотите извлечь:

wget -O - http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar Jx -C /usr/local/bin --transform='s:.*/::' --wildcards '*/ffmpeg' '*/ffprobe'

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

3
ответ дан 23 July 2018 в 20:02

Команда для получения имени каталога из файла tar.xz:

tar tJvf tar-file-name.tar.xz | head -1 | awk '{print $6}'

Вам понадобится:

Получить имя каталога (например, используя вышеуказанное решение ) и сохраните его в переменной, распакуйте файл tar.xz (например, используя команду tar xf), переместите файлы с помощью переменной каталога

Объяснение, как получить имя каталога из tar file:

Параметры tar:

-f file -J xz compression -t list content -v verbose

head -1 - печатает строку файла

awk '{print $6}' - печатает 6-й элемент, который имя каталога

Примеры:

Получить имя каталога (например, используя вышеприведенное решение) и сохранить его в переменной [ ! d13]

Результаты с:

coreutils-8.22/ tar.bz2 пример для ffmpeg-3.4.2.tar.bz2 tar tjvf ffmpeg-3.4.2.tar.bz2 | head -1 | awk '{print $ 6}'

Результаты с:

ffmpeg-3.4.2/ Обратите внимание, что для сжатых файлов bz2 я использовал флаг tar j
0
ответ дан 23 July 2018 в 20:02

Другие вопросы по тегам:

Похожие вопросы: