当前位置: 首页 > 知识库问答 >
问题:

tar:文件在我们读取时发生了变化

章彬郁
2023-03-14

我正在使用maketar来备份。在执行makefile时,tar命令显示文件在读取时发生了更改。在这种情况下,

    < li >当警告出现时,tar包正常 < li >但它会停止tar命令以进行后续备份 < li >显示警告的文件实际上没有改变-出现警告真是奇怪 < li >显示警告的文件随机出现,我的意思是,每次我运行makefile时,显示警告的文件都是不同的 < Li > < code >-ignore-failed-read 没有帮助。我在MinGW使用tar 1.23 < li >我刚把电脑换成了WIN7 64位。该脚本在旧的32位WIN7中运行良好。但是tar版本没有1.23版本新。

如何停止tar的警告,以便在警告后停止我的备份?

编辑-2:这可能是原因

正如我上面所说的,bash外壳脚本在我的旧计算机中运行良好。与旧计算机相比,msys版本是不同的。tar命令的版本也是如此。在旧计算机中,tar是1.13.19,在新计算机中是1.23。我复制了旧的tar命令,没有将其依赖msys-1.0.dll复制到新计算机并将其重命名为tar_old。并且我还更新了外壳脚本中的tar命令并运行脚本。然后一切都好。所以,似乎问题是tar命令。我确信taring时没有更改任何文件。是不是新版本tar命令的错误?我不知道。

编辑-1:添加更多详细信息

备份由bash shell脚本调用。它扫描目标目录并构建makefile,然后调用make来使用tar命令进行备份。接下来是由bash shell脚本构建的典型makefile。

#--------------------------------------------
# backup VC
#--------------------------------------------
# the program for packing
PACK_TOOL=tar

# the option for packing tool
PACK_OPTION=cjvf

# M$: C driver
WIN_C_DIR=c:

# M$: D driver
WIN_D_DIR=d:

# M$: where the software is
WIN_PRG_DIR=wuyu/tools
# WIN_PRG_DIR=

# where to save the backup files
BAKDIR=/home/Wu.Y/MS_bak_MSYS

VC_FRAMEWORK=/home/Wu.Y/MS_bak_MSYS/tools/VC/VC_framework.tar.bz2
VC_2010=/home/Wu.Y/MS_bak_MSYS/tools/VC/VC_2010.tar.bz2

.PHONY: all

all: $(VC_FRAMEWORK) $(VC_2010)

$(VC_FRAMEWORK): $(WIN_C_DIR)/$(WIN_PRG_DIR)/VC/Framework/*
    @$(PACK_TOOL) $(PACK_OPTION) "$@" --ignore-failed-read /c/$(WIN_PRG_DIR)/VC/Framework
$(VC_2010): $(WIN_C_DIR)/$(WIN_PRG_DIR)/VC/VS2010/*
    @$(PACK_TOOL) $(PACK_OPTION) "$@" --ignore-failed-read /c/$(WIN_PRG_DIR)/VC/VS2010

如您所见,tar包存储在~/MS_bak_MSYS/tools/VC/VC_2010.tar.bz2中。我在~/qqaa中运行脚本。~/MS_bak_MSYS被排除在tar命令之外。所以,我正在创建的tar文件不在我试图放入tar文件的目录中。这就是为什么我觉得出现警告很奇怪的原因。

共有3个答案

凌翔宇
2023-03-14

如果您需要帮助调试这样的问题,您需要提供make规则或至少提供您调用的tar命令。如果没有命令可供查看,我们如何查看命令的错误?

但是,99%的情况下,像这样的错误意味着您正在尝试放入tar文件的目录中创建tar文件。因此,当 tar 尝试读取目录时,它会将 tar 文件作为目录的成员找到,开始读取它并将其写出到 tar 文件中,因此在它开始读取 tar 文件和完成读取 tar 文件之间,tar 文件已更改。

例如,类似于:

tar cf ./foo.tar .

没有办法“停止”这一点,因为它没有错。只需在创建它时将您的tar文件放在其他地方,或者找到另一种方法(使用--排除或其他任何方法)来省略tar文件。

咸疏珂
2023-03-14

虽然已经很晚了,但我最近也遇到了同样的问题。

问题是因为 dir . 正在更改,因为 xyz.tar.gz是在运行命令后创建的。有两种解决方案:

解决方案1: tar不会介意在< code >内的任何目录中创建归档文件。。无法在工作空间之外创建归档可能有一些原因。通过创建一个临时目录来存放归档文件,解决了这个问题:

mkdir artefacts
tar -zcvf artefacts/archive.tar.gz --exclude=./artefacts .
echo $?
0

解决方案2:我喜欢这个。在运行 tar 之前创建归档文件:

touch archive.tar.gz
tar --exclude=archive.tar.gz -zcvf archive.tar.gz .
echo $?
0
易超
2023-03-14

我还遇到了tar消息“随着我们的阅读而改变”。对我来说,这些消息发生在我在位烘焙构建环境中制作Linux文件系统的tar文件时。此错误是零星的。

对我来说,这不是因为从同一目录创建tar文件。我假设在创建tar文件的过程中确实有一些文件被覆盖或更改。

该消息是一个警告,它仍然会创建 tar 文件。我们仍然可以通过设置选项来抑制这些警告消息

--警告=no-文件-已更改

(http://www.gnu.org/software/tar/manual/html_section/warnings.html)

在警告消息情况下,tar返回的退出代码仍然是“1 ”: http://www . GNU . org/software/tar/manual/html _ section/synopsis . html

因此,如果我们从脚本中的某个函数调用tar文件,我们可以像这样处理退出代码:

set +e 
tar -czf sample.tar.gz dir1 dir2
exitcode=$?

if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then
    exit $exitcode
fi
set -e
 类似资料:
  • 我正在尝试使用Java中的Apache commons compress将tar文件解压缩为。我能够解压缩大部分的tar文件,但很少有失败的,除了下面的例外。我不确定是什么引起了这个问题。tar文件是否已损坏?我可以在windows中使用7zip解压缩文件,但相同的文件在编程解压缩时失败。我正在使用Appache commons-compress1.18 下面是我的代码

  • 使用Runtime方法运行下面的命令,使用java生成目录的tar 用于创建tar的Java代码 Java进程是一个服务器,它在每次输入后处理后创建tar文件。在处理了几个输入之后,流程停留在tar步骤。 运行 以查找进程是否卡住,并显示在输出下方 我手动运行了输入目录的tar命令,它工作得很好。任何指示为什么会发生这种情况? 更新: 对于如下所示的目录结构 进程正在为其生成tar的目录是di1。

  • 我有一个.tar文件,其中包含文件夹中的许多.gz文件。这些 gz 文件中的每一个都包含一个.txt文件。与此问题相关的其他堆栈溢出问题旨在提取文件。 我试图反复阅读每一个的内容。txt文件,因为。焦油很大。 首先我阅读了. tar文件的内容: 或在Unix中: 然后我尝试使用tarfile提取文件方法,但我得到一个错误:“模块'tarfile'没有属性'提取文件'”。此外,我甚至不确定这是正确的

  • 问题内容: 我正在尝试解析一些日志文件,因为它们是用Go语言编写的,但是我不确定在不进行检查更改的情况下一次又一次地重新读取该文件的情况下,如何实现这一点。 我希望能够读到EOF,等到下一行写完后再读到EOF,依此类推。感觉有点像。 问题答案: 我已经编写了一个Go程序包github.com/hpcloud/tail来完成此任务。 … 引用kostix的答案: 在现实生活中,文件可能会被截断,替换

  • 问题内容: 我必须阅读tomcat日志文件,并在一段时间(例如:一个小时)后再次读取该文件(仅针对新添加的内容),因此我创建了RandomAccessFile来记录我完成的最后一个位置并使用BufferedReader.readLine()方法。 但是,我发现有时我无法读取文件的整行。 例如,tomcat正在尝试编写以下内容(仅作为示例): 192.168.0.0本地主机/index.html .