标签: tar

如何通过 tar 管道 scp/ssh 文件传输(拉)(远程->本地传输从本地机器启动)

我想通过 tar 进行 scp pull 操作(下面没有 tar 的示例),以便只为大约 10 个目录写入一个 tar 文件:

user@localhost:/home/user> scp -r remoteuser@remotehost:dir_to_transfer ./
Run Code Online (Sandbox Code Playgroud)

我在远程机器上有目录,每个目录有大约 10,000 个小(~28k)文件要传输。由于文件配额,我没有太多可用空间在远程主机(remotehost)上运行 tar 命令。由于防火墙规则,我只能从我的本地机器(本地主机)启动传输。

绝对数量的文件使传输时间很长。

我已经找到了在“推送”数据时如何执行此操作的示例,但想知道在“拉”数据时如何执行此操作。

本地机器信息:

  • 操作系统:OpenSuSe 13.2(x86_64)

  • 重击 4.2.53(1)

  • OpenSSH_6.6.1p1、OpenSSL 1.0.1k-fips 2015 年 1 月 8 日

远程机器信息:

  • 操作系统:CentOS 5.11 版(最终版)
  • bash 3.2.25(1)
  • OpenSSH_4.3p2、OpenSSL 0.9.8e-fips-rhel5 2008 年 7 月 1 日

ssh scp tar pipe

2
推荐指数
1
解决办法
8769
查看次数

tgz 文件提供无效的压缩数据——违反格式

我已经下载了这个文件

http://download.icu-project.org/files/icu4c/55.1/icu4c-55_1-HPUX11iv3-aCC.tgz
https://ssl.icu-project.org/files/icu4c/55.1/icu4c-bin-55_1.md5
Run Code Online (Sandbox Code Playgroud)

md5sum 好的

但是在 linux 和 hpux 11.31 上给我这个错误,我已经输入了各种命令

gunzip icu4c-55_1-HPUX11iv3-aCC.tgz 

gunzip: icu4c-55_1-HPUX11iv3-aCC.tgz: invalid compressed data--format violated

gunzip -d < icu4c-55_1-HPUX11iv3-aCC.tgz| tar xvf -

gzip: stdin: invalid compressed data--format violated
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

tar -tvf icu4c-55_1-HPUX11iv3-aCC.tgz 

gzip: stdin: invalid compressed data--format violated
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Run Code Online (Sandbox Code Playgroud)

tar gzip

2
推荐指数
1
解决办法
2万
查看次数

tar 生成的输出文件

tar可用于将整个目录收集到一个文件中。我尝试使用sampledir仅包含一些文本文件的示例目录,没有子目录。原来目录占用52K

$ du -h sampledir/
52K sampledir/
Run Code Online (Sandbox Code Playgroud)

我跑了

$ tar -cf tararchive.tar sampledir/
Run Code Online (Sandbox Code Playgroud)

生成的文件是

$ du -h tararchive.tar 
40K tararchive.tar
Run Code Online (Sandbox Code Playgroud)

它小于sampledir: 但在命令中我没有要求任何压缩。我指的是 BSD 版本tar(也在 Ubuntu 中使用)。

那么,究竟是tar什么?它是否只是简单地收集目录及其所有文件,插入一些标题以标记它们的结束和开始?如果是这样,怎么可能tararchive.tar比原来的目录小,甚至不压缩?

tar directory disk-usage

2
推荐指数
1
解决办法
251
查看次数

如何通过 tar 传输使用 wget 下载的文件?

我想通过管道.tar.gz传输我用 GNU Wget ( wget)下载的tarball(在这种情况下是文件)tar -xzf(解压缩它们,如果不清楚的话)但我不知道如何。我试过了:

wget -q -O- ${SRC_URI} | tar -xzf > ${DESTDIR}
Run Code Online (Sandbox Code Playgroud)

wget -q -O- ${SRC_URI} | `tar -xzf` > ${DESTDIR}
Run Code Online (Sandbox Code Playgroud)

wget -q -O- ${SRC_URI} | 'tar -xzf' > ${DESTDIR}
Run Code Online (Sandbox Code Playgroud)

甚至没有人接近做我想做的事。我也尝试过省略输出组件> ${DESTDIR},只让 tar 以默认方式提取 tarball 的内容。每次尝试通常都会返回如下错误:

tar: option requires an argument -- 'f'
Run Code Online (Sandbox Code Playgroud)

在它下载tarball之前,或者什么都不下载,然后我会检查是否${DESTDIR}已经创建了设置的路径(因为我正在离开tar来生成它)并且它没有。

tar pipe shell-script wget

2
推荐指数
1
解决办法
4145
查看次数

在提取中没有 -f 选项的 tar

我的问题类似于问题What do the -f parameter in the tar command,但它与存档提取有关。如果我发出tar x而不是tar xf mytarball.tar,是否期望我通过标准输入“输入”存档?这应该由Ctrl-Z终止?

tar

2
推荐指数
1
解决办法
1218
查看次数

tar 同时避免压缩某些文件类型

我正在尝试使用tar. 但是,有许多文件,例如CR2(Canon RAW 2),JPG以及一些其他已压缩的文件。

我已经看到tar使用该--exclude选项从存档本身中排除这些类型的文件,但这不是我想要做的。相反,我想包含这些已经压缩的文件,但跳过对它们的压缩,类似于rsync's 的压缩--skip-compress

这可能吗,如果是,怎么做?

tar compression

2
推荐指数
1
解决办法
1060
查看次数

将 tar 与 find 一起使用

假设我们要查找某个文件,对它们使用 tar 并删除它们。我尝试使用

touch "mycompress.bz2.tar"
find . \( -name "*.c" -o -name "*.sh*" \) -exec tar ujf "mycompress.bz2.tar" {} "+" \; -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

但是执行这个我的终端就关闭了。我怎样才能正确地实现这一点?

shell bash tar shell-script

2
推荐指数
1
解决办法
354
查看次数

linux tar 是否阻止对文件的写访问

我在实时网络服务器上有一个很大(> 10GB)的文件夹,里面装满了我需要备份和传输的图像。

我担心如果我对文件夹进行 tar 处理,网络服务器会阻止这些文件的读取,而网络服务器每秒会多次访问这些文件。

linux 中的 tar 命令是否阻止读取它正在处理的文件?

tar lock concurrency files

2
推荐指数
1
解决办法
1504
查看次数

tar --list 有效吗?

我之前问过如何创建多卷存档的索引。该问题包含这样一个假设,即tar --list在写入我的卷后使用必须重新读取我的所有数据,因此速度很慢

然而,这是真的吗?它是否必须重新读取每个字节,或者 GNU tar 是否足够智能以查找存档成员并因此非常快速地列出存档内容?

我用 35GB 的 tar 文件做了一些测试,结果(在 2 秒内完成)似乎表明这--list确实很快,尽管我不完全相信我的测试方法并且不能排除缓存或其他东西的影响别的我不明白。

tar

2
推荐指数
1
解决办法
366
查看次数

如何使用单个命令检查“ls”是否输出某些内容?

TL/DR:我在 Solaris 10 中工作。我有一个ls ... | egrep ...命令,我需要知道它是否输出任何结果。我可以| wc -c在末尾添加一个;但我需要结果(0 或非零)在退出代码中,而不是在输出中。而且我不能使用if,它不是 bash 脚本,我只能执行一个命令。


长版:我正在编写一个维护过程来压缩和删除 Solaris 10 系统中的旧日志文件。它检查给定路径中的所有 .log 或 .xml 文件,获取给定月份最后修改的文件,用它们创建一个 .tar,然后删除原始文件:

ls -Egopqt /path/ | egrep -i '2016-10-[0123][0-9] .*(\.log$|\.xml$)' | awk '{ print $7 }'
| xargs tar -cvf target.tar
Run Code Online (Sandbox Code Playgroud)

与删除文件相同,只需将最后一部分替换为: | xargs -i rm {}

我可能把它复杂化了,但它有效。除非给定月份没有文件;如果是这种情况,我会收到一条错误消息tar: Missing filenames。在尝试创建 tar 之前如何检查它?我想到了这样的事情,使用 wc 检查是否有输出

ls ... | egrep ... | wc -c
Run Code Online (Sandbox Code Playgroud)

0当没有任何文件时正确输出,否则输出另一个数字。问题是: …

ls solaris tar exit files

2
推荐指数
1
解决办法
4376
查看次数

标签 统计

tar ×10

files ×2

pipe ×2

shell-script ×2

bash ×1

compression ×1

concurrency ×1

directory ×1

disk-usage ×1

exit ×1

gzip ×1

lock ×1

ls ×1

scp ×1

shell ×1

solaris ×1

ssh ×1

wget ×1