我通常这样做:

tar -czvf my_directory.tar.gz my_directory

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

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

我想要:

my_file
my_file
my_file

当前回答

我发现最简单的方法是:

CD my_dir && tar -czvf ../my_dir.tar.gz *

其他回答

cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..

这个方法对我很有用,它包含了所有隐藏文件,而不用把所有文件放在一个名为“。”的根目录中,就像tomoe的回答:

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

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 -
tar -czvf mydir.tgz -C my_dir/ `ls -A mydir`

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

cd DIRECTORY
tar -czf NAME.tar.gz  *

星号将包括所有内容,甚至包括隐藏的内容