екстракт дьогтю в каталог з такою ж базовою назвою?


18

У мене є подібний файл myArchive123.tar.gz. Всередині він містить папку типуhelloWorld

Якщо я витягую його: tar -xf myArchive123.tar.gzя отримую helloWorldпапку:

ls 
myArchive123.tar.gz
helloWorld 

Я хотів би, щоб вихід був таким самим ім'ям, як ім'я файлу мінус розширення .tar.gz. Тобто:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

Це можна зробити?

  • Я ніколи не знаю, що всередині архіву. Можливо папка, може бути багато файлів.
  • Було б добре з використанням іншого інструменту, якщо смола не може це зробити.
  • Буду добре з довшою формою, яку можна перетворити на сценарій

EDIT
Тим часом я зламав собі сценарій, який, здається, виконав роботу. (див. мою опубліковану відповідь нижче). Якщо його можна вдосконалити, будь ласка, публікуйте коментарі / додаткові відповіді. Головне, щоб вона була упакована в однокласинник, наприклад:

extract <file>

1
Чи завжди в архіві міститься рівно одна папка?
Марк Плотнік


Я не знаю, що всередині нього під час видобутку. Це також не повинно залежати від того, що знаходиться в архіві. Якщо це папка, витягніть її там. якщо це файл, витягніть всі файли.
Лев Уфімцев

Тим часом я склав сценарій (див. Нижче). Я можу прийняти відповідь лише через 2 дні ти.
Лев Уфімцев

Чи буде в архіві колись міститися більше ніж одна папка на верхньому рівні?
Марк Плотнік

Відповіді:


10

З gnu tar, ви можете використовувати --xform(або --transform), щоб додати /prefix/до кожного імені файлу:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

Зверніть увагу , там немає провідної /в prefix/і sedвираженні решт з , Sщоб виключити символічні цілі посилання з перетворень імен файлів.
Щоб перевірити його (сухий):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

Щоб розпочати, ось дуже спрощений сценарій, до якого можна звернутися як extract <file>:

STRIP = $ {1%. *} Останній суфікс # Strip
ІМ'Я = $ {УМОВАХ% .tar} #strip .tar суфікс, якщо він присутній
tar -xf "$ 1" --xform = "s | ^ | $ NAME / | S" #run команда

Це близько до того, що я хочу, за винятком того, що я хотів би мати можливість упакувати його в щось на кшталт: витяг <file>
Лев Уфімцев

Це баггі, він зупиняється на першій крапці. Наприклад, у мене є такий файл: eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz Я очікую вихід без .tar.gz, але я отримую eclipse-sdk-4
Лев Уфімцев

У вищезазначеному сценарії я знімаю розширення та знімаю його далі, якщо я знаходжу "тар".
Лев Уфімцев

Загалом, з багатьма видами архівів. Я сподівався на швидку однолінійку, я подумав, що, можливо, я пропустив якийсь прапор аргументу. Але здається, що тривіального рішення цього немає?
Лев Уфімцев

Хороший матеріал. Це працює і коротше сценарію, який я написав. Приємно!
Лев Уфімцев

7

Що ж, ви могли зробити це хоча б за пару кроків. Якби ти

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

це дозволить виконати завдання, хоча там може бути більш компактна відповідь.


3

Редагувати

Прийнята відповідь коротша нижче. (роби те саме, але коротше, як правило, краще).


Зрештою, я зламав собі сценарій для завдання. він працює з .tar .tar.gz і .gz

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

Використання:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

Зауважте, що це рішення може мати крапки в імені файлу. Наприклад Eclipse-4.5M-SDK.tar.gz.

Я зберігаю сценарій у своєму git repo. Останню версію дивіться на веб-сторінці : https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here


2

Ще одне можливе рішення - це використання --transformопції:

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

З вашими файлами:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
але це передбачає, що ви знаєте, що знаходиться всередині архіву
Лев Уфімцев

наприклад, як би я перетворив це на однорядковий сценарій, не знаючи, що знаходиться в архіві?
Лев Уфімцев

Ви маєте рацію. Це лише одне можливе рішення, як я тут писав ...
svq

Чи є різниця між цим і --strip-compoments = 0 myArchive123?
Лев Уфімцев

1
І --strip-components=0просто видаляє перше ім'я каталогу із шляху та з -Cопцією зберігає знезаражені файли у новий каталог.
svq
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.