我通常这样做:
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 -czvf my_directory.tar.gz my_directory
如果我只想在my_directory中包含所有内容(包括任何隐藏的系统文件),而不包括目录本身,该怎么办?我不想:
my_directory
--- my_file
--- my_file
--- my_file
我想要:
my_file
my_file
my_file
当前回答
使用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形式的条目。然后,阅读其他答案。
其他回答
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
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 -
我建议使用以下Bash函数(第一个参数是dir的路径,第二个参数是结果存档的basename):
function tar_dir_contents ()
{
local DIRPATH="$1"
local TARARCH="$2.tar.gz"
local ORGIFS="$IFS"
IFS=$'\n'
tar -C "$DIRPATH" -czf "$TARARCH" $( ls -a "$DIRPATH" | grep -v '\(^\.$\)\|\(^\.\.$\)' )
IFS="$ORGIFS"
}
你可以这样运行它:
$ tar_dir_contents /path/to/some/dir my_archive
它将在当前目录中生成归档文件my_archive.tar.gz。它适用于隐藏(.*)元素和文件名中有空格的元素。
使用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形式的条目。然后,阅读其他答案。
cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..
这个方法对我很有用,它包含了所有隐藏文件,而不用把所有文件放在一个名为“。”的根目录中,就像tomoe的回答: