在一行 shell 中下载并解压

在一行 shell 中下载并解压

我应该从互联网上获取 GNU tar 的源代码(http://ftp.gnu.org/gnu/tar/tar-latest.tar.gz)并在一行 Shell 中提取源代码的所有文件中包含的所有 C 头文件的列表,我知道我应该使用管道,具体来说是命令 wget,但我不知道如何使其工作。如果我手动完成,列表如下:

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

答案1

像这样的东西可以工作,但需要存在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

相关内容