我通常这样做:
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_directory.tar.gz *
cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..
这个方法对我很有用,它包含了所有隐藏文件,而不用把所有文件放在一个名为“。”的根目录中,就像tomoe的回答:
我发现最简单的方法是:
CD my_dir && tar -czvf ../my_dir.tar.gz *
这个答案在大多数情况下都适用。但是请注意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
tar -C my_dir -zcvf my_dir.tar.gz `ls my_dir`