Linux

在一行shell中下載和解壓

  • December 16, 2018

我應該從 Internet ( http://ftp.gnu.org/gnu/tar/tar-latest.tar.gz )獲取 GNU tar 的原始碼並提取原始碼的所有文件中包含的所有 C 標頭檔的列表在一行 Shell 中,我知道我應該使用流水線,具體來說是命令 wget,但我不知道如何使它工作。如果我手工完成,清單如下:

wordsplit.h ws2tcpip.h xalloc.h xalloc-oversized.h xattr-at.h xattrs.h xgetcwd.h xsize.h

像這樣的東西有效,但需要 curl & tar 存在(通常在大多數係統中預設可用)

$ curl -sL -o- "http://ftp.gnu.org/gnu/tar/tar-latest.tar.gz" |tar -tz --wildcards --no-anchored '*.h'
tar-1.29/build-aux/snippet/_Noreturn.h
tar-1.29/build-aux/snippet/arg-nonnull.h
tar-1.29/build-aux/snippet/c++defs.h
tar-1.29/build-aux/snippet/unused-parameter.h
tar-1.29/build-aux/snippet/warn-on-use.h
tar-1.29/gnu/uniwidth/cjk.h
tar-1.29/gnu/argp.h
tar-1.29/gnu/argp-fmtstream.h
tar-1.29/gnu/argp-namefrob.h
tar-1.29/gnu/argp-version-etc.h
tar-1.29/gnu/bitrotate.h
tar-1.29/gnu/c-ctype.h
tar-1.29/gnu/c-strcase.h
tar-1.29/gnu/full-write.h
tar-1.29/gnu/gettext.h
tar-1.29/gnu/localcharset.h
tar-1.29/gnu/mbuiter.h
tar-1.29/gnu/progname.h
tar-1.29/gnu/se-context.in.h
tar-1.29/gnu/se-selinux.in.h
---------many more files follow-------------

甚至與 grep 結合使用:

$ curl -sL -o- "http://ftp.gnu.org/gnu/tar/tar-latest.tar.gz" |tar -zt |grep '/src/.*\.h$'
tar-1.29/src/arith.h
tar-1.29/src/common.h
tar-1.29/src/tar.h
tar-1.29/src/xattrs.h

考慮到您的問題涉及*“提取所有 C 標頭檔的列表”,*我假設您只需要像上面這樣的列表。

如果你想獲取這些.h文件的內容,你可以使用這樣的東西來“轉儲”螢幕上的內容:

$ curl -sL -o- "http://ftp.gnu.org/gnu/tar/tar-latest.tar.gz" |tar -xzO --wildcards --no-anchored '*.h'

提示:在最後結合起來|less以便於閱讀。

最後,要使其完整,正如@don_crissti 建議的那樣,在本地驅動器中提取“* .h”文件而不是螢幕轉儲,您可以使用:

$ curl -sL -o- "http://ftp.gnu.org/gnu/tar/tar-latest.tar.gz" |tar -xzf - --wildcards --no-anchored '*.h'

tar-1.29將在您目前的工作目錄下創建一個新文件夾,包括所有.h文件。

$ ls -ld tar-1.29
drwxr-xr-x 7 root root 4096 Mar 24 01:48 tar-1.29
$ ls -l tar-1.29
total 20
drwxr-xr-x 3 root root 4096 Mar 24 01:48 build-aux
drwxr-xr-x 3 root root 4096 Mar 24 01:48 gnu
drwxr-xr-x 2 root root 4096 Mar 24 01:48 lib
drwxr-xr-x 2 root root 4096 Mar 24 01:48 src
drwxr-xr-x 2 root root 4096 Mar 24 01:48 tests

引用自:https://unix.stackexchange.com/questions/353443