我在部署过程中使用 tar 来提取文件。我注意到 systemctl 发出警告,如果 .service 文件的时间戳发生更改,即使文件内容保持不变,也必须运行 daemon-reload 。
如何配置 tar 在文件内容未更改的情况下不更改文件日期?
我在部署过程中使用 tar 来提取文件。我注意到 systemctl 发出警告,如果 .service 文件的时间戳发生更改,即使文件内容保持不变,也必须运行 daemon-reload 。
如何配置 tar 在文件内容未更改的情况下不更改文件日期?
我有一个 tar.gz 存档,其中包含一些可执行文件。有没有办法在我提取存档时自动使它们不可执行?我尝试使用 --mode 标志,但它显然没有任何作用。
tar xzf archive.tar.gz --mode 'a-x'
如果可能的话,我想使用 tar 本身设置权限,因为我事先不知道 tar 生成的文件夹的名称是什么。我可以使用 GNU tar 功能。
我想展平并归档以下结构:
├── a
│ └── a.txt
├── ...
│ └── ...
└── z
└── z.txt
在这个 tar 存档中:
a.txt
...
z.txt
例如,我可以
cp
,然后存档--append
)并--directory
每次使用--strip-components
还有其他聪明的主意吗?
很久以前,我为我们的网站编写了一个备份脚本,并从那时起就对其进行了更新。然而,偶尔会出现问题,一些较旧的备份现在已损坏。
过去,我曾zipinfo
在自动化脚本中使用该实用程序来尝试确定以前的备份是否损坏,然后重新尝试备份,但虽然我们仍然有一些备份,但(zip
至少)存在两个问题。
首先,zip
有根本的限制,因此我们用于tar
更大的备份。
其次,zip
它捕获的元数据不如它那么多tar
,因此我们更喜欢它来处理某些类型的事情。
此外,我们已经转向gzip
而不是zip
,并且我们也在压缩我们的tars
......
我们的备份现在很大,我正在尝试找出要删除的内容和要保留的内容 - 保留损坏的文件没有意义。因此,我正在编写一个脚本来合并我们的各种备份目录(来自现场和异地等),并且我觉得非常需要检查每个文件的有效性,因为有时一个副本已损坏,而另一个副本则正常。
我找了一个gzip
版本zipinfo
,但没有找到。我从来没有听说过这样的事情tar
,但我可能只是无知!
我当然不想诉诸于扩展磁盘空间!
我有一个 gz 存档,但出于某种原因tar
说格式不正确,即使我可以在 mac Finder 中双击它并正常提取它,并且file
命令显示与任何其他 tar.gz 文件相同的格式
为什么会这样以及如何从终端中提取它?
$ file archive.gz
archive.gz: gzip compressed data, original size modulo 2^32 4327594
$ tar -xzf archive.gz
tar: Error opening archive: Unrecognized archive format
$ tar --version
bsdtar 3.5.1 - libarchive 3.5.1 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.8
关于tar
命令
例如:
source
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
如果是numbers.tar.gz
通过命令创建文件,那么tar -czf numbers.tar.gz numbers
现在我们有:
source
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
考虑mv numbers.tar.gz target
命令是否被执行,因此我们有:
target
numbers.tar.gz
如果tar -xzf numbers.tar.gz
命令被执行,那么我们有
target
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
因此,作为一般概述,我们有:
source
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
target
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
让我们假设以下简单更新:
target
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222222 content <--- updated
003.txt # with the 333 content
如果目录中的tar -xzf numbers.tar.gz
命令target
被执行因此002.txt
文件被覆盖,所以它的 222222 内容返回到 222。直到这里我没问题。
为了保证新数据的安全或避免不需要的覆盖,可以使用--keep-old-files
和--skip-old-files
选项,根据tar(1) - Linux 手册页,它表示:
-k, --keep-old-files
don't replace existing files when extracting, treat them as errors
--skip-old-files
don't replace existing files when extracting, silently skip over them
因此执行以下两个命令:
tar --keep-old-files -xzf numbers.tar.gz
tar --skip-old-files -xzf numbers.tar.gz
发生以下情况:
tar: numbers/222.txt: Cannot open: File exists
错误消息并且数据保持安全(保留在 222222 中)v
使用该选项则例外 - 它显示tar: numbers/222.txt: skipping existing file
消息;并且数据保持安全(保留在 222222 中)。用于脚本用途。到这里为止,一切都很好。
经过研究我找到了这个--keep-newer-files
选项,并再次根据tar(1) - Linux man page,它表明:
--keep-newer-files
don't replace existing files that are newer than their archive copies
因此执行以下命令:
tar --keep-newer-files -xzf numbers.tar.gz
发生以下情况:
tar: Current ‘numbers/222.txt’ is newer or same age
消息并且数据保持安全(与 222222 保持一致)实际上,此--keep-newer-files
选项的作用与--skip-old-files
about 相同,以避免覆盖但显示不同的消息。
问题
--keep-newer-files
选项而不是和选项?tar
--keep-old-files
--skip-old-files
我想知道这个选项是强制性的具体情况是什么。
使用该unzip -n /path/to/filename/filename.zip
命令,压缩文件将被解压缩,但不会覆盖现有文件。当之前解压缩相同的压缩文件并且某些文件被删除或重命名时,此方法很有用- 因此使用此n
选项他们可以检索它们。
命令的相同方法是什么tar
但用于提取目的?
通常我使用tar -xzf /path/to/filename.tar.gz
命令
关于tar
命令
如果执行命令:
tar -czf numbers.tar.gz numbers
该numbers.tar.gz
文件是从numbers
- 在当前目录中创建的
但出于脚本目的- 通过测试 - 如果执行:
tar -czf ~/numbers.tar.gz /home/username/numbers
tar -czf /home/username/numbers.tar.gz /home/username/numbers
这两个命令都按预期工作,但总是出现以下消息:
发生这种情况是因为至少有一条路径 - 在这种情况下,两者都具有/包含该/
字符。我知道这不是错误,但很好奇
问题
我假设它是信息或警告消息,出于脚本目的,需要它定义tar.gz
要创建的路径和directory
要压缩的源 - 我不想在终端中看到该消息。有可能吗?有什么选择?
在 Linux Ubuntu 中,关于这些版本的“tar”命令:
tar -tzf /path/to/filename.tar.gz # Show the content
tar -xzf /path/to/filename.tar.gz # Extract the content
观察这两个命令都使用该z
选项,并且它们按预期工作。
通过man tar
,关于该z
选项,它表示:
-z, --gzip, --gunzip, --ungzip
Filter the archive through gzip(1).
问题
tar
使用命令?gzip
'z'
额外问题
关于Filter the archive through gzip(1).
部分。
"filter"
在上面显示的两个命令中需要它?或 的含义或上下文是filter
什么?我尝试使用 SSH 将存档下载到远程计算机,并在远程客户端上提取存档,因为它具有更好的性能。
我有一个非常简单的脚本,它可以下载存档,然后tar xjOf
通过远程客户端上的 ssh 来提取文件。我现在想将 tar 命令的输出通过管道传输到可以将提取的文件保存在本地客户端上的某个进程。我认为 tar 应该具有这种能力,但我无法找到任何解决方案。
#!/bin/bash
ssh $1@$2 'wget https://url.to.my/archive.tar.bz2' #Save the archive to the remote client
ssh $1@$2 'tar archive.tar.bz2 -xjOf' | ??? #What local tool can be used to take the output and save the files from it?
我对 Linux 和 shell 脚本相当陌生,因此代码可能有很多改进方法,但现在我只想知道如何将这些文件保存到我的本地客户端。
谢谢您的帮助