大容量のtar.gzファイルをダウンロードし、同時に解凍するために以下の機能を使用します。これでファイルがSTDOUTに保存されました。別のファイルディレクトリにどのように移動できますか?
wget -q -O - target URL | tar -zxvf -
ベストアンサー1
STDOUTでは抽出されませんが、アーカイブメンバーは相対パスとして抽出されます。現在の作業ディレクトリ。たとえば、アーカイブに、、、および、Membersというメンバーが含まれていて、現在/foo
のfile1
作業dir
ディレクトリがある場合、files²、、、、が作成されます。dir/file2
dir/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
作業ディレクトリを一時停止します。d
tar
tar
tar
一部の実装では、次のオプションも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
、ファイルが移動されますfile1
。dir
厳密に言えば、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/bar
foo
sort -u
xargs
mv -t
ただし、安全のために名前を変更する前に、レビュー用にリストをファイルに保存することをお勧めします。
1少なくともO
GNU tarを使用するにはオプションが必要ですが、アーカイブ内のすべてのファイルの内容をstdoutに送信すること(たとえば、端末でコマンドを実行している場合に表示するため)はおそらく望むものではありません。
²セキュリティ対策として、ほとんどのtar
実装では、抽出時にアーカイブメンバーのブートストラップを削除します。/
で始まるメンバーがある場合、../
一部はそのメンバーを完全にスキップし、一部はコンポーネントを削除します../
。