web-dev-qa-db-ja.com

tarballにあるすべてのuser:groupをリストする最も簡単な方法は何ですか?

古いサーバーから新しいサーバーにデータの一部をインストールしています。

私には古いサーバーが古くからあったため、大量のレガシーデータがあり、レガシーユーザーとグループ名が含まれていることは間違いありません。

抽出するとき、tarはユーザーとグループの情報を名前で照合するために最善を尽くし、識別子をフォールバックとして、または現在のユーザーを最後の手段として使用します。

抽出を行う前に、すべてのユーザーとグループが存在することを確認してください。これにより、すべてのファイルが正しいIDを取得します。

これを行うには、私が考えることができる最良の方法は、tarファイルにあるすべてのユーザー名とグループ名をリストすることです。 tar tvf backup.tarコマンドを使用してすべてのファイルを一覧表示しますが、正しい2つの名前を抽出する方法を考え出す必要があります。

tvオプションを使用するよりも簡単な方法があるのだろうかと思います。ユーザー名とグループ名のみを抽出するいくつかのツールまたはコマンドラインオプション、sort -uリストを一意のエントリに減らします。

誰かがそのような機能を知っていますか?

10
Alexis Wilke

興味深い質問です。 manページをざっと見て( "user"を検索すると、結果が表示されない場合は、 "owner"を検索)、次のようにします。

tar xf thetarball.tgz --to-command='sh -c "echo $TAR_UNAME $TAR_GNAME"' | sort | uniq -c

もちろん、必要に応じてスクリプトを変更してください。 $TAR_UIDおよび$TAR_GIDいくつかのユースケースでは名前の代わりに。

また、--owner-mapおよび--group-maptarのオプション;これらは、ユースケースに大きなメリットをもたらす可能性があり、すべてのユーザーとグループを事前に作成するよりもはるかに簡単です。

15
Wildcard

すばやく組み立て:

グループ:

tar tvf thetarball.tgz | awk '{print $2}' | cut -d/ -f2 | sort -u

ユーザー:

tar tvf thetarball.tgz | awk '{print $2}' | cut -d/ -f1 | sort -u

ユーザー/グループのペア:

tar tvf thetarball.tgz | awk '{print $2}' | sort -u
7