我通常这样做:
tar -czvf my_directory.tar.gz my_directory
Run Code Online (Sandbox Code Playgroud)
如果我只想在my_directory中包含所有内容(包括任何隐藏的系统文件),而不是目录本身,该怎么办?我不想要:
my_directory
--- my_file
--- my_file
--- my_file
Run Code Online (Sandbox Code Playgroud)
我想要:
my_file
my_file
my_file
Run Code Online (Sandbox Code Playgroud)
dub*_*bek 630
使用-Ctar 的开关:
tar -czvf my_directory.tar.gz -C my_directory .
Run Code Online (Sandbox Code Playgroud)
该-C my_directory告诉tar改变当前目录my_directory,然后.表示"添加整个当前目录"(包括隐藏文件和子目录).
确保在执行-C my_directory之前执行操作.,否则您将获取当前目录中的文件.
小智 217
cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd -
Run Code Online (Sandbox Code Playgroud)
应该在一条线上完成这项工作.它也适用于隐藏文件."*"不会通过路径名扩展来扩展隐藏文件,至少在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
Run Code Online (Sandbox Code Playgroud)
mat*_*sza 55
您也可以像往常一样创建存档并使用以下内容解压缩:
tar --strip-components 1 -xvf my_directory.tar.gz
Run Code Online (Sandbox Code Playgroud)
Mag*_*nus 32
看一下--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
Run Code Online (Sandbox Code Playgroud)
变换表达式类似于sed,并且我们可以使用除/(,在上面的示例中)之外的分隔符.
https://www.gnu.org/software/tar/manual/html_section/tar_52.html
aro*_*oss 22
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Run Code Online (Sandbox Code Playgroud)
在某些情况下(仅归档文件,目录和符号链接):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Run Code Online (Sandbox Code Playgroud)
不幸的是,下面包含了./存档中的父目录:
tar -czf mydir.tgz -C /my/dir .
Run Code Online (Sandbox Code Playgroud)
您可以使用--transform配置选项将所有文件移出该目录,但这并没有消除.目录本身.驯服命令变得越来越困难.
您可以使用$(find ...)向命令添加文件列表(如在magnus的答案中),但这可能导致"文件列表太长"错误.最好的方法是将它与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 -
Run Code Online (Sandbox Code Playgroud)
基本上它的作用是列出你目录下的所有文件(-type f),链接(-type l)和子目录(-type d),使所有文件名相对使用-printf "%P\n",然后将其传递给tar命令(它从STDIN使用文件名-T -).-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
Run Code Online (Sandbox Code Playgroud)
例如,如果要过滤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
Run Code Online (Sandbox Code Playgroud)
该命令使用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 -
Run Code Online (Sandbox Code Playgroud)
Rob*_*her 16
这个答案应该适用于大多数情况.但请注意文件名如何存储在tar文件中,例如,./file1而不仅仅是file1.我发现这在使用此方法操作在BuildRoot中用作包文件的tarball时会引起问题.
一种解决方案是使用一些Bash globs列出所有文件,除了..像这样:
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
Run Code Online (Sandbox Code Playgroud)
这是我从这个答案中学到的一个技巧.
现在,如果没有匹配的文件焦油将返回错误..?*或.[^.]*,但它仍然可以工作.如果错误是一个问题(您正在检查脚本中的成功),这可以工作:
shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob
Run Code Online (Sandbox Code Playgroud)
虽然现在我们正在搞乱shell选项,但我们可能会认为*匹配隐藏文件比较简洁:
shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob
Run Code Online (Sandbox Code Playgroud)
这可能不适*用于当前目录中的shell globs ,因此,使用:
shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob
Run Code Online (Sandbox Code Playgroud)
mat*_*sza 14
cd my_directory
tar zcvf ../my_directory.tar.gz *
Run Code Online (Sandbox Code Playgroud)
小智 6
cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..
Run Code Online (Sandbox Code Playgroud)
这个对我有用,它包含所有隐藏文件,而不将所有文件放在名为“.”的根目录中。就像在tomoe 的回答中一样: