我通常这样做:

tar -czvf my_directory.tar.gz my_directory

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

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

我想要:

my_file
my_file
my_file

当前回答

命令

创建标准归档文件。

find my_directory/ -maxdepth 1 -printf "%P\n" | tar -cvf my_archive.tar -c my_directory/ - t -

打包文件和dirs文件在存档的根目录下,没有路径信息,较深的文件有相对路径。 没有奇怪的样子。”/'放在文件和dirs前面。(“。/文件”) 没有特殊文件。’。

似乎需要另一个工具,如find或ls (ls -A -1)来实现这些目标,而tar仅使用其参数无法根据这样的要求选择文件并创建存档。

使用上述命令创建一个tar归档文件,可以进一步处理或交付给某人,而不需要看起来奇怪或需要解释或工具来解压缩。

参数描述

maxdepth 1 最多下降1级-无递归。 printf 在标准输出上打印格式 %P文件的名称,删除它所在的起始点的名称。 \ n换行符 Printf不会在字符串的末尾添加换行符。必须加在这里

沥青: -C DIR,——directory=DIR 更改目录

-T FILE,——files-from=FILE 获取要从FILE中提取或创建的名称 - 上面的FILE是来自管道的标准输入


对其他解决方案的评论。

The same result might be achieved using solution described by @aross. The difference with the solution here is in that which tool is doing the recursing. If you leave the job to find, every filepath name, goes through the pipe. It also sends all directory names, which tar with --no-recursion ignores or adds as empty ones followed by all files in each directory. If there was unexpected output as errors in file read from find, tar would not know or care what's going on. But with further checks, like processing error stream from find, it might be a good solution where many options and filters on files are required. I prefer to leave the recursing on tar, it does seem simpler and as such more stable solution. With my complicated directory structure, I feel more confident the archive is complete when tar will not report an error.

@serendrewpity提出的另一个使用find的解决方案似乎很好,但它在带有空格的文件名上失败了。不同之处在于$()子shell提供的find输出是空格分隔的。可以使用printf添加引号,但这会使语句更加复杂。

当使用../my_archive.tar作为tar路径时,没有理由先cd到my_directory,然后再返回,因为tar有-C DIR,——directory=DIR命令,这就是为了这个目的。

使用。(dot)将包含圆点

使用*将让shell提供输入文件列表。可以使用shell选项来包含点文件。但这很复杂。该命令必须在允许的shell中执行。启用和禁用必须在tar命令之前和之后执行。如果根目录的未来存档包含太多的文件,它将失败。

最后一点也适用于所有不使用管道的解决方案。

大多数解决方案是创建一个目录,里面是文件和dirs。这几乎是人们所不希望看到的。

其他回答

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

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

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

cd my_directory
tar zcvf ../my_directory.tar.gz *
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

看一看——transform/——xform,它让你有机会在文件添加到存档时修改文件名:

% mkdir my_directory
% touch my_directory/file1
% touch my_directory/file2
% touch my_directory/.hiddenfile1
% touch my_directory/.hiddenfile2
% tar -v -c -f my_dir.tgz --xform='s,my_directory/,,' $(find my_directory -type f)
my_directory/file2
my_directory/.hiddenfile1
my_directory/.hiddenfile2
my_directory/file1
% tar -t -f my_dir.tgz 
file2
.hiddenfile1
.hiddenfile2
file1

Transform表达式类似于sed,在上面的例子中,我们可以使用除/(之外的分隔符)。 https://www.gnu.org/software/tar/manual/html_section/tar_52.html

你也可以像往常一样创建存档并提取它:

tar --strip-components 1 -xvf my_directory.tar.gz