@ford
に基づく の答え。これにより、それが my_dirname フォルダーに抽出されます。現在存在するファイルに影響を与えることなく、空のフォルダーを適切にクリアできるようにします。
tar xzf images.tgz --transform='s/.*\///' -C my_dirname
find my_dirname -type d -empty -delete
ほぼ --transform フラグを使用して、tar だけで可能ですが、私が知る限り、残りのディレクトリを削除する方法はありません.
これにより、アーカイブ全体がフラット化されます:
tar xzf images.tgz --transform='s/.*\///'
出力は
folder1/
folder2/
folder3/
img.gif
img2.gif
img3.gif
残念ながら、別のコマンドでディレクトリを削除する必要があります。
tar のバージョンを確認してください。例:
$ tar --version
バージョンが >= の場合 tar-1.14.90 より --strip-components
を使用
tar xvzf web.dirs.tar.gz -C /srv/www --strip-components 2
それ以外の場合は --strip-path
を使用してください
tar xvzf web.dirs.tar.gz -C /srv/www --strip-path 2
--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