どのように抽出しますかただ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
後者に注意してくださいrmdir
。tar
結果のディレクトリが空であっても、ディレクトリの作成をスキップするように指示できないため、後で削除できます。
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
現在抽出されているファイルのデータは標準入力を介して到着します。
スクリプトで使用されるテストは、次のことを保証します。
- 私たちが抽出するファイルは一般的なファイルであり、
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/*.*