ダウンロードと抽出機能を使用した後にSTDOUTに保存されているファイルを検索するには?

ダウンロードと抽出機能を使用した後にSTDOUTに保存されているファイルを検索するには?

大容量のtar.gzファイルをダウンロードし、同時に解凍するために以下の機能を使用します。これでファイルがSTDOUTに保存されました。別のファイルディレクトリにどのように移動できますか?

wget -q -O - target URL | tar -zxvf -

ベストアンサー1

STDOUTでは抽出されませんが、アーカイブメンバーは相対パスとして抽出されます。現在の作業ディレクトリ。たとえば、アーカイブに、、、および、Membersというメンバーが含まれていて、現在/foofile1作業dirディレクトリがある場合、files²、、、、が作成されます。dir/file2dir/link -> file2/home/sosa/home/sosa/foo/home/sosa/file1/home/sosa/dir/home/sosa/dir/file2/home/sosa/dir/link

別のディレクトリへの相対パスとして抽出するには、次のようにします。

wget -q -O - URL | (cd some/other/directory && tar -zxvf -)

つまり、アーカイブメンバーに関連する抽出を実行する前に、実行するプロセスの現在のc作業ディレクトリを一時停止します。dtartartar

一部の実装では、次のオプションもtar使用できます。-C

wget -q -O - URL | tar -C some/other/directory -zxvf -

現在の作業ディレクトリにアーカイブを抽出したがファイルを別の場所に移動する場合は、現在のディレクトリ内のどのファイルがアーカイブから抽出されたか、どのファイルがすでに存在するかを確認する必要があります。

過去10分以内にアーカイブを抽出し、その時間間隔中に現在のディレクトリ内の他のファイルに触れていない場合は、次のことがzshできます。

mv -- *(Dcm-10) /some/other/dir/

とともに最後に変更された時刻過去10分以内に移動しました/some/other/dir/

findまたはとのGNU実装を使用してくださいmv

find . -mindepth 1 -maxdepth 1 -cmin -10 -exec mv -vt /some/other/dir {} +

上記の例ではfoo、ファイルが移動されますfile1dir厳密に言えば、dir/file2ファイルは移動されず、まだディレクトリdir/linkに接続されていますが、dirディレクトリがdir移動されると、新しいフルパスは/some/other/dir/dir/file2/some/other/dir/dir/link

ファイルが認識されている時間枠を分離できない場合は、アーカイブを再ダウンロードしてアーカイブメンバーのリストを検索し、各ファイルの最初のパス部分を抽出する必要があります。アーカイブメンバーに改行文字が含まれていないと仮定すると、GNUシステムは次のことができます。

xargs -rd'\n' -a <(
  wget -qO- URL |
    tar -ztf - |
    LC_ALL=C sed -E 's@^((|\.|\.\.)/)*@@; s@/.*@@; /^(|\.|\.\.)$/d' |
    LC_ALL=C sort -u) mv -vt some/other/dir --

wgetアーカイブをダウンロードtarし、-tその内容を一覧表示し、sed先行/、、コンポーネントと最初のパスコンポーネントを除くすべてのコンポーネントを削除し(すべて、に変換) 、./重複エントリを削除し、各行を別々の引数として渡します。。../foo/bar/foo/bar /.././../foo/barfoosort -uxargsmv -t

ただし、安全のために名前を変更する前に、レビュー用にリストをファイルに保存することをお勧めします。


1少なくともOGNU tarを使用するにはオプションが必要ですが、アーカイブ内のすべてのファイルの内容をstdoutに送信すること(たとえば、端末でコマンドを実行している場合に表示するため)はおそらく望むものではありません。

²セキュリティ対策として、ほとんどのtar実装では、抽出時にアーカイブメンバーのブートストラップを削除します。/で始まるメンバーがある場合、../一部はそのメンバーを完全にスキップし、一部はコンポーネントを削除します../

おすすめ記事