我通常这样做:

tar -czvf my_directory.tar.gz my_directory

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

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

我想要:

my_file
my_file
my_file

当前回答

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

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

其他回答

# tar all files within and deeper in a given directory
# with no prefixes ( neither <directory>/ nor ./ )
# parameters: <source directory> <target archive file>
function tar_all_in_dir {
    { cd "$1" && find -type f -print0; } \
    | cut --zero-terminated --characters=3- \
    | tar --create --file="$2" --directory="$1" --null --files-from=-
}

安全处理包含空格或其他不寻常字符的文件名。您可以选择添加一个名称'*。Sql '或类似于find命令的过滤器来限制包含的文件。

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

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

使用tar的-C开关:

tar -czvf my_directory.tar.gz -C my_directory .

-C my_directory命令告诉tar将当前目录更改为my_directory,然后。意思是“添加整个当前目录”(包括隐藏文件和子目录)。

确保在执行之前执行-C my_directory。否则,您将获得当前目录中的文件。

警告:你会得到。/file-name格式的条目。Ext而不是file-name.ext!

如果需要file-name形式的条目。然后,阅读其他答案。

命令

创建标准归档文件。

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。这几乎是人们所不希望看到的。

tar -C my_dir -zcvf my_dir.tar.gz `ls my_dir`