我通常这样做:
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
当前回答
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
其他回答
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
我建议使用以下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 my_dir -zcvf my_dir.tar.gz `ls my_dir`
这个答案在大多数情况下都适用。但是请注意tar文件中的文件名是如何存储的,例如,./file1而不仅仅是file1。我发现,在使用此方法操作作为BuildRoot包文件的tarball时,这会导致问题。
一种解决方案是使用一些Bash glob列出除..之外的所有文件。是这样的:
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
这是我从这个回答中学到的一个技巧。
现在如果没有文件匹配,tar将返回一个错误。?*或。[^。*,但它仍然可以工作。如果错误是一个问题(你正在检查一个脚本是否成功),这是有效的:
shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob
虽然现在我们正在处理shell选项,但我们可能会决定使用* match隐藏文件会更整洁:
shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob
这可能不适用于当前目录下的shell glos *,所以,或者,使用:
shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob
如果使用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)
测试这个解决方案: