我正在尝试存档一个包含隐藏文件和文件夹的项目文件夹,但我得到的文件夹的根目录条目为.
。这很烦人。通常:
tar -czf $ARCHIVE_NAME -C $DIR .
将创建如下档案
./package.json
./.git
./.gitignore
.
.
.
我希望档案的根目录是实际的文件和文件夹,而不是条目.
。例如
package.json
.git
.gitignore
.
.
.
我怎么做?
* 编辑 *
下图可能有助于澄清这个问题。
- 左侧是使用项目的 GUI 工具创建的档案(两天前)。
- 右侧是使用上述
tar
命令创建的档案。
注意“位置”栏;右侧的档案应该是/
,并且不是 /./
。
答案1
./
表示当前目录。您的两个列表完全相同。
./
在列出存档时,在文件前面显示有助于处理具有特殊名称的文件。文件名将-file
显示为./-file
允许第二个工具处理。
答案2
更改命令
tar -czf $ARCHIVE_NAME -C $DIR .
到
tar -czf $ARCHIVE_NAME -C $DIR ./*
应该可以解决问题。这样,您就不是说“将目录添加.
到存档”,而是说“将目录中的所有这些文件添加.
到存档”。
答案3
此命令将压缩当前目录中不带前导 .tar 的文件./
:
tar cf /some/tarfile.tar *
当然,它不会包含以句点开头的文件名,这可能不是您想要的。您可以添加其他通配符来捕获这些:
tar cf /some/tarfile.tar * .[a-zA-Z]*
但这不是一个通用的解决方案;您必须知道目录中的文件名,以便可以制作适当的通配符。
GNU tar(大多数 Linux 发行版都使用)具有使用表达式转换文件名的功能sed
。这将./
在创建存档时从文件中删除:
tar cf /some/tarfile.tar --transform 's,^\./,,' .
生成的档案中仍然会包含“.”目录本身的条目。
的某些版本tar
可以从文件中读取要打包的文件的名称。您可以利用该功能来执行此操作:
ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin
该管道构建当前目录中所有文件的列表,删除.
和..
条目,然后将其余名称通过管道传输到。tar 从读取的文件名(其标准输入)tar
中创建存档。/dev/stdin