我通常这样做:

tar -czvf my_directory.tar.gz my_directory

如果我只想在my_directory中包含所有内容(包括任何隐藏的系统文件),而不包括目录本身,该怎么办?我不想:

my_directory
   --- my_file
   --- my_file
   --- my_file

我想要:

my_file
my_file
my_file

当前回答

art archive:

# tar -czvf mydir.tar.gz mydir

archive:涂

# tar -xf mydir.tar.gz

其他回答

如果它是Unix/Linux系统,并且你关心隐藏文件(会被*漏掉),你需要做:

cd my_directory
tar zcvf ../my_directory.tar.gz * .??*

我不知道Windows下的隐藏文件是什么样子。

这个答案在大多数情况下都适用。但是请注意tar文件中的文件名是如何存储的,例如,./file1而不仅仅是file1。我发现,在使用此方法操作作为BuildRoot包文件的tarball时,这会导致问题。

一种解决方案是使用一些Bash glob列出除..之外的所有文件。是这样的:

tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *

这是我从这个回答中学到的一个技巧。

现在如果没有文件匹配,tar将返回一个错误。?*或。[^。*,但它仍然可以工作。如果错误是一个问题(你正在检查一个脚本是否成功),这是有效的:

shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob

虽然现在我们正在处理shell选项,但我们可能会决定使用* match隐藏文件会更整洁:

shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob

这可能不适用于当前目录下的shell glos *,所以,或者,使用:

shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob

这对我来说很有效。

tar -cvf my_dir.tar.gz -C /my_dir/ $(find /my_dir/ -maxdepth 1 -printf '%P ')

你也可以用

tar -cvf my_dir.tar.gz -C /my_dir/ $(find /my_dir/ -mindepth 1 -maxdepth 1 -printf '%P ')

在第一个命令中,find返回my_dir的文件和子目录列表。 但是,目录my_dir本身包含在该列表中为'。' -printf参数删除包括'在内的完整路径。’以及所有CRLF 然而,printf格式字符串'%P '中的空格在my_dir的文件和子目录列表中留下了残余,可以通过find命令结果中的前导空格看到。

这对TAR来说不是问题,但如果你想修复这个问题,就像第二个命令一样添加-mindepth 1。

tar -czvf mydir.tgz -C my_dir/ `ls -A mydir`

运行它比mydir高一级。 这将不包括任何[。之类的。

cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd - 

应该在一条线上完成工作。它也可以很好地处理隐藏文件。“*”不会通过路径名展开隐藏文件,至少在bash中是这样。下面是我的实验:

$ mkdir my_directory
$ touch my_directory/file1
$ touch my_directory/file2
$ touch my_directory/.hiddenfile1
$ touch my_directory/.hiddenfile2
$ cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd ..
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2
$ tar ztf my_dir.tgz
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2