どのようにファイルを抽出できますか?.tar.gz抽出されたファイルの痕跡を保持しながら保存しますか?
たとえば、次のようなファイル構造があるとします。
ROOT
╠═▶ children
║ ╠═▶ joe.txt
║ ╚═▶ george.txt
╠═▶ bar.txt
╠═▶ foo.txt
╚═▶ A̲R̲C̲H̲I̲V̲E̲.t̲a̲r̲.b̲z̲
├─▷ children
│ ├─▷ joe.txt
│ └─▷ bob.txt
├─▷ hello.txt
├─▷ world.txt
└─▷ foo.txt
これで、最新のファイルを保持しながらアーカイブからファイルを抽出する場合は、どのようなファイルが抽出されたかを知りたいと思います。
tar xf ./ARCHIVE.tar.gz --keep-newer-files | xargs -I EXTRACTED_FILE echo EXTRACTED_FILE
答え1
--to-command
このオプションを使用して、抽出されたすべてのファイルの印刷をトリガーします。
引数は、環境変数TAR_FILENAMEを使用してファイル名を取得するコマンドです。STDIN
STDIN
したがって、抽出されたファイルを読み込み、生成する必要があり、STDOUT
生成されたファイルに印刷できます。
tar -xzf ../ARCH.tgz --keep-newer-files \
--to-command="sh -c $(printf '%q' \
'mkdir -p "$(dirname "$TAR_FILENAME")";dd of="$TAR_FILENAME" >/dev/null 2>&1;echo "#EXTRACTED#$TAR_FILENAME" ')" > output_tar.txt
抽出された各ファイルには1行がありますoutput_tar.txt
。
バラより外部プログラムへの書き込み詳しくは
答え2
私の要件に応じて、アーカイブコンテンツに一致する利用可能なすべての抽出ファイル(最新バージョンであるかどうか)を一覧表示する必要があります。
この場合、tar抽出が実行または実行されない場合は、効果的に抽出されたファイルを一覧表示できます。
私はこうする:
tar -xzf ./ARCH.tgz --keep-newer-files
for file in $(tar -tf ./ARCH.tgz 2>/dev/null)
do
if [[ -e $file && ! -d $file ]]
then
echo $file
fi
done > output_tar.txt
xargsを使用するあまり明確ではありませんが、きれいな解決策は次のとおりです。
tar -tf ./ARCH.tar 2>/dev/null | xargs -L1 bash -c 'if [[ -e $0 && ! -d $0 ]]; then echo $0; fi;'