Подтвердить что ты не робот

Как извлечь файлы без структуры папок с помощью tar

У меня есть tar.gz файл со следующей структурой:

folder1/img.gif
folder2/img2.gif
folder3/img3.gif

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

/img.gif
/img2.gif
/img3.gif

Мне нужно сделать это с помощью комбинации Unix и PHP. Вот что я до сих пор, он работает, чтобы извлечь их в указанный каталог, но сохраняет иерархию папок:

exec('gtar --keep-newer-files -xzf images.tgz -C /home/user/public_html/images/',$ret);
4b9b3361

Ответ 1

Вы можете использовать опцию - strip-components для tar.

 --strip-components count
         (x mode only) Remove the specified number of leading path ele-
         ments.  Pathnames with fewer elements will be silently skipped.
         Note that the pathname is edited after checking inclusion/exclu-
         sion patterns but before security checks.

Я создаю файл tar с аналогичной структурой для вашего:

$tar -tf tarfolder.tar
tarfolder/
tarfolder/file.a
tarfolder/file.b

$ls -la file.*
ls: file.*: No such file or directory

Затем извлечение выполняется:

$tar -xf tarfolder.tar --strip-components 1
$ls -la file.*
-rw-r--r--  1 ericgorr  wheel  0 Jan 12 12:33 file.a
-rw-r--r--  1 ericgorr  wheel  0 Jan 12 12:33 file.b

Ответ 2

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

Это сгладит весь архив:

tar xzf images.tgz --transform='s/.*\///'

Выход будет

folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif

Вам нужно будет удалить каталоги с помощью другой команды, к сожалению.

Ответ 3

Проверьте версию tar, например.

$ tar --version

Если версия > =, чем tar-1.14.90, используйте --strip-components

tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2

else использовать --strip-path

tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2

Ответ 4

На основе ответа @ford. Этот файл будет извлечен в папку my_dirname. Чтобы мы могли корректно очистить пустые папки без затронутых существующих файлов.

tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete

Ответ 5

Найти img *.gif в любой подпапке mytar.tar.gz и извлечь в. /

tar -zxf mytar.tar.gz --absolute-names --no-anchored img *.gif --transform = 's:. */::'

Найти img *.gif в любой из трех папок, перечисленных в этом конкретном вопросе в mytar.tar.gz, и извлечь в. /

tar -zxf mytar.tar.gz --absolute-names --no-anchored img *.gif --transform = 's: ^ папка [1-3]/::'