我需要压缩一些文件,其中一个是点文件。
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
,而不是两个文件a
和b
。
因此,正如评论中所建议的,您应该对不同的文件使用不同的变量: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
,但在这种情况下,由于引用,空间没有特殊含义,因此整个值将被视为单个路径。