How do I extract files without folder structure using tar

后端 未结 5 1440
无人共我
无人共我 2021-01-30 12:11

I have a tar.gz-file with the following structure:

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

I want to extract the image files without

相关标签:
5条回答
  • 2021-01-30 12:49

    You can use the --strip-components option of 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.
    

    I create a tar file with a similar structure to yours:

    $tar -tf tarfolder.tar
    tarfolder/
    tarfolder/file.a
    tarfolder/file.b
    
    $ls -la file.*
    ls: file.*: No such file or directory
    

    Then extracted by doing:

    $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
    
    0 讨论(0)
  • 2021-01-30 13:06

    Check the tar version e.g.

    $ tar --version
    

    If version is >= than tar-1.14.90 use --strip-components

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

    else use --strip-path

    tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2
    
    0 讨论(0)
  • 2021-01-30 13:07

    This is almost possible with tar alone, using the --transform flag, except that there's no way to delete the left over directories as far as I can tell.

    This will flatten the entire archive:

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

    The output will be

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

    You will then need to delete the directories with another command, unfortunately.

    0 讨论(0)
  • 2021-01-30 13:12

    Find img*.gif in any sub folder of mytar.tar.gz and extract to ./

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

    Find img*.gif in any of the 3 folders listed in this specific question in mytar.tar.gz and extract to ./

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

    0 讨论(0)
  • 2021-01-30 13:15

    Based on @ford's answer. This one will extract it to the my_dirname folder. So that we can properly clear the empty folders without affected currently existing files.

    tar xzf images.tgz --transform='s/.*\///' -C my_dirname
    find my_dirname -type d -empty -delete
    
    0 讨论(0)
提交回复
热议问题