ファイル名は次のとおりですが、ディレクトリはlibgit2-0.21-1ですtar xvf v0.21.1.tar.gz
。次に、単一のライナーを使用してディレクトリ名を取得する方法(ディレクトリが3つ以上の場合はエラーが報告されます):
tar tvf v0.21.1.tar.gz | head
drwxrwxr-x root/root 0 2014-08-05 08:09 libgit2-0.21.1/
-rw-rw-r-- root/root 1169 2014-08-05 08:09 libgit2-0.21.1/.HEADER
-rw-rw-r-- root/root 22 2014-08-05 08:09 libgit2-0.21.1/.gitattributes
-rw-rw-r-- root/root 321 2014-08-05 08:09 libgit2-0.21.1/.gitignore
-rw-rw-r-- root/root 1246 2014-08-05 08:09 libgit2-0.21.1/.mailmap
これには解決策がありますが、明らかにこれが最善の解決策ではありません。また、上部に複数のディレクトリがあることを確認する必要があります。
mkdir libgit2 && tar xvf v0.21.1.tar.gz -C libgit2 --strip-components 1
答え1
tarballをコマンドライン引数として使用して、次のスクリプトを実行します。
#!/bin/bash
DIR=$(tar tvf ${1} | egrep -o "[^ ]+/$")
if [ $(echo ${DIR} | egrep -o " " | wc -l) -eq 0 ]; then
echo ${DIR};
else
echo "ERROR: multiple directories in tarball base"
exit 1
fi
答え2
修正する申し訳ありません。最上位ディレクトリの名前も欲しいという事実を忘れてしまいました。 "else"を含めるようにコマンドを更新しました。ディレクトリが1つしか見つからない場合は、その名前が表示されます。 「ERROR」が発生すると、「test.file」の内容を見てtarのディレクトリを見ることができます。
この試み:
$ zcat test.tar.gz | tar xvf - | \
awk -F/ '{print $1}' | \
uniq > test.file && \
if (($(wc -l 'test.file' | \
awk '{print $1}')>1));then echo "ERROR";else cat test.file;fi
メンズキャット
zcat は gunzip -c と同じです。 (一部のシステムでは、圧縮する元のリンクを維持するためにzcatをgzcatとしてインストールできます。)zcatは、コマンドラインまたは標準入力からファイルリストを解凍し、圧縮されていないデータを標準出力に書き込みます。 zcat は、.gz サフィックスがあるかどうかに関係なく、正しいマジック番号でファイルを解凍します。
awk -F/ '{印刷$1} |
「/」で示される最初の一意の単語を印刷します。
>テストファイル
ファイルへの出力の書き込み
(($(wc -l 'test.file' | awk '{print $1}')>1))
デュアル((..))構造を使用すると、算術拡張と評価が可能です.wc -l
ファイルの行数を取得します。awk '{print $1}')>1
行数の最初の列のみを取得し、その数が1より大きいことを確認します。then echo "ERROR"
tarファイルで複数のディレクトリが見つかると、「エラー」が印刷されます。
お役に立てば幸いです。