我通常这样做:

tar -czvf my_directory.tar.gz my_directory

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

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

我想要:

my_file
my_file
my_file

当前回答

TL;DR (no ./和no ./file1!)

find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

在某些条件下(只归档文件,dirs和符号链接):

find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

解释

不幸的是,下面包含了归档文件中的父目录./:

tar -czf mydir.tgz -C /my/dir .

您可以使用——transform配置选项将所有文件移出该目录,但这不能消除。目录本身。指挥变得越来越难驯服。

您可以使用$(find…)向命令中添加一个文件列表(就像在magnus的answer中一样),但这可能会导致“文件列表太长”错误。最好的方法是将它与tar的-T选项结合起来,就像这样:

find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

基本上,它所做的是列出目录下的所有文件(-type f)、链接(-type l)和子目录(-type d),使用-printf "%P\n"使所有文件名相对,然后将其传递给tar命令(它使用-t -从STDIN获取文件名)。需要使用-C选项,以便tar知道具有相对名称的文件位于何处。——no-recursion标志是为了让tar不会递归到它被告知要归档的文件夹(导致重复文件)。

如果你需要对文件名做一些特殊的事情(过滤,跟踪符号链接等),find命令是非常强大的,你可以通过删除上面命令的tar部分来测试它:

$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore

例如,如果你想过滤PDF文件,添加!- name“* . pdf”

$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore

Non-GNU找到

该命令使用printf(在GNU find中可用),它告诉find用相对路径打印结果。然而,如果你没有GNU find,这将使路径相对(用sed删除父类):

find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -

其他回答

art archive:

# tar -czvf mydir.tar.gz mydir

archive:涂

# tar -xf mydir.tar.gz
 tar -cvzf  tarlearn.tar.gz --remove-files mytemp/*

如果文件夹是mytemp,那么如果你应用上面的方法,它会压缩并删除文件夹中的所有文件,但不要管它

 tar -cvzf  tarlearn.tar.gz --remove-files --exclude='*12_2008*' --no-recursion mytemp/*

您可以给出排除模式,也可以指定不查看子文件夹

使用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形式的条目。然后,阅读其他答案。

这对我来说很有效。

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。

如果使用bash,这可能是最简单的答案。 使用shopt -s dotglob, bash命令将:

不包括根目录。 将包含根目录中的隐藏文件。

cd my_directory
shopt -s dotglob
tar -czvf ../my_directory.tar.gz *
shopt -u dotglob

(来自https://stackoverflow.com/a/9776491/7726468)

测试这个解决方案: