包含点文件时出现 tar 错误

包含点文件时出现 tar 错误

我需要压缩一些文件,其中一个是点文件。

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

变量替换避免了tar: Removing leading '/' from member names警告,并简化了解压过程。

但我收到这个错误:

tar:tmp/foo/.env tmp/foo/docker-compose.yml:无法统计:没有这样的文件或目录

硬编码路径有效:tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml.

所以我认为问题在于处理该点文件,或者与转义有关?

答案1

当外壳膨胀时"$FILES",空间就失去了其语法价值。因此该命令作为单个路径tar接收。tmp/foo/.env tmp/foo/docker-compose.yml

就像

file='a b'
touch "$file"

将创建文件a b,而不是两个文件ab

因此,正如评论中所建议的,您应该对不同的文件使用不同的变量:tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}".


直接运行有效的事实tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml是因为空格在那里具有语法价值,将一个参数与另一个参数分开。对于“人眼”来说, "$FILES"to扩展后会产生相同的空间tmp/foo/.env tmp/foo/docker-compose.yml,但在这种情况下,由于引用,空间没有特殊含义,因此整个值将被视为单个路径。

相关内容