Tar:ファイルのみを抽出します(サブディレクトリは除く)。

Tar:ファイルのみを抽出します(サブディレクトリは除く)。

どのように抽出しますかただtar アーカイブ内のディレクトリにファイルがありますか?特定のファイルではなく、ディレクトリ内のすべてのファイルを抽出する必要があります。たとえば、次の構造のtarアーカイブがあります。

wordpress
 --wp-admin
 --wp-content
 --wp-includes
 --index.php
 --license.txt
 --readme.html

サブディレクトリではなく、WordPressディレクトリ内から3つ以上のファイルのみを抽出したいと思います。

このサイトで見つけることができる他の解決策は、特定のファイル抽出に関するものです。私の質問は抽出に関するものです。みんな文書。

答え1

ディレクトリ名とファイル名の形式を想定できない場合は、同じレベルで(空の)ディレクトリを抽出せずに特定のレベルでファイルを抽出する方法が見つかりません。 (ファイル名にドットが含まれているがディレクトリにドットがない場合もう一つの答え十分でしょう。 )

370358.tarこの内容を検討してください

wordpress/
wordpress/index.php
wordpress/license.txt
wordpress/readme.html
wordpress/wp-admin/
wordpress/wp-admin/admin.php
wordpress/wp-content/
wordpress/wp-content/2021/
wordpress/wp-content/2021/01/
wordpress/wp-content/2021/01/19/
wordpress/wp-content/2021/01/19/today.txt
wordpress/wp-content/content.txt
wordpress/wp-content/here.txt
wordpress/wp-content/some.txt
wordpress/wp-includes/

wordpress/*次のように一致するファイルを抽出できます

tar xf /tmp/370358.tar --wildcards --exclude '*/*/*' && rmdir */* 2>/dev/null

ls -R wordpress
wordpress:
index.php  license.txt  readme.html

後者に注意してくださいrmdirtar結果のディレクトリが空であっても、ディレクトリの作成をスキップするように指示できないため、後で削除できます。

wordpress実際にディレクトリが抽出に含まれたくない場合は、

tar xf /tmp/370358.tar --strip-components 1 --wildcards --exclude '*/*/*' && rmdir * 2>/dev/null

ls -R
.:
index.php  license.txt  readme.html

答え2

GNUを使用すると仮定すると、tar短いスクリプトでアーカイブを抽出できますbash

tar -x -f archive.tar --to-command=./script.sh

...script.sh実行可能なスクリプトがある場所

#!/bin/bash

if [ "$TAR_FILETYPE" = f ] &&
   [[ $TAR_FILENAME == wordpress/* ]] &&
   [[ $TAR_FILENAME != wordpress/*/* ]]
then
    mkdir -p "${TAR_FILENAME%/*}" &&
    cat >"$TAR_FILENAME" &&
    chmod "$TAR_MODE" "$TAR_FILENAME" &&
    chown "$TAR_UNAME:$TAR_GNAME" "$TAR_FILENAME" || true
else
    cat >/dev/null
fi

ここで使用される変数はTAR_*スクリプト環境でGNUによって設定され、tar現在抽出されているファイルのデータは標準入力を介して到着します。

スクリプトで使用されるテストは、次のことを保証します。

  1. 私たちが抽出するファイルは一般的なファイルであり、
  2. wordpressファイルは他のディレクトリではなくそのディレクトリにあります。

ファイルを抽出するには、ファイルディレクトリがあることを確認し、標準入力を正しいファイル名にリダイレクトしてから、ファイルモードと所有権を変更して権限と所有者が正しいことを確認します。

明らかに、コマンドラインにスクリプトを含めることもできますtar

tar -x -f archive.tar --to-command='bash -c "
    if [ \"\$TAR_FILETYPE\" = f ] &&
       [[ \$TAR_FILENAME == wordpress/* ]] &&
       [[ \$TAR_FILENAME != wordpress/*/* ]]
    then
        mkdir -p \"\${TAR_FILENAME%/*}\" &&
        cat >\"\$TAR_FILENAME\" &&
        chmod \"\$TAR_MODE\" \"\$TAR_FILENAME\" &&
        chown \"\$TAR_UNAME:\$TAR_GNAME\" \"\$TAR_FILENAME\" || true
    else
        cat >/dev/null
    fi"'

答え3

これにより、サブディレクトリに移動せずにディレクトリ内のすべてのファイルをtarファイルに抽出します。

tar --wildcards --no-wildcards-match-slash -xvf file.tar.gz directory_in_tar/*.*

関連情報