我通常做的:

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_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

其他提示

使用焦油-C开关:

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

-C my_directory告诉tar改变当前目录my_directory,然后.意味着“添加整个当前目录”(包括隐藏的文件和子目录)。

请确保你做-C my_directory你做.之前,否则你会得到在当前目录下的文件。

您还可以创建存档照常,并用提取它:

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

看一看--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

变换表达式类似于sed的,我们可以使用比/(在上面的例子,)其它的分隔符。结果 https://www.gnu.org/software/tar/manual/html_section /tar_52.html

TL; DR

find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -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 -

解释

在下面不幸包括在归档中的父目录./

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

您可以通过使用--transform配置选项移出该目录中的所有文件,但是,这并不摆脱.目录本身。它变得越来越难以驯服该命令。

您可以使用$(find ...)到文件列表添加到命令(如在马格努斯的回答),但有可能导致“文件列表太长”的错误。最好的办法是将它与焦油的-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命令(它使用需要的文件名从STDIN -T -)。需要的-C选项,以便焦油知道哪里有相对名称的文件的位置。该--no-recursion标志是使焦油不递归到文件夹,它被告知档案(导致重复文件)。

如果您需要做文件名很特别(过滤,下面的符号链接等),该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

非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文件中,例如,./file1而不仅仅是file1。我发现,这种用此方法来操纵用作的buildroot 包文件压缩包时引起的问题。

的一个解决方案是使用一些击水珠列出除了这样..所有文件:

tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *

这是一个特技我从此答案。

现在,如果没有匹配..?*.[^.]*文件焦油会返回一个错误,但它仍然可以工作。如果错误是一个问题(你检查在脚本成功),这个作品:

shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob

虽然现在我们正在与壳选择搞乱,我们可能会认为它是整洁有*匹配隐藏文件:

shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob

这可能无法工作,其中在当前目录下你的shell水珠*,所以另外,使用:

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

如果它是一个Unix / Linux系统,你在意隐藏文件(将错过*),你需要做的:

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

我不知道是什么隐藏的文件看起来像在Windows下。

我建议下面bash函数(第一个参数是路径目录,第二个参数是生成的存档的基名):

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。它的工作原理与隐藏(。*)元件,并与在其文件名空间元素。

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

这一个工作对我来说,它是包括所有隐藏文件没有把所有文件名为根目录“”像在知惠的回答

使用PAX。

大同是弃用包,但完全没有工作和以简单的方式。

pax -w > mydir.tar mydir

我发现的最简单方法:

CD MY_DIR &&焦油-czvf ../my_dir.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=-
}

安全处理与空格或其他特殊字符的文件名。可以将-name '*.sql'或类似的过滤器任选地添加到查找指令,以限制包括在文件中。

 tar -cvzf  tarlearn.tar.gz --remove-files mytemp/*

如果该文件夹是MYTEMP那么如果您将它上面将压缩并删除该文件夹中的所有文件,但不要管它

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

您可以给排除模式,并指定不考虑子太

tar -C my_dir -zcvf my_dir.tar.gz `ls my_dir`
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top