停止Unix`tar`命令在解包时创建完整的目录路径

时间:2014-09-15 23:35:15

标签: macos bash archive tar

背景

我经常在Mac OS X上使用tar命令,主要是因为我非常依赖find和" LaunchBar "。

LaunchBar 是由键盘命令调用的应用程序启动器。按命令空间(可配置),弹出一个小窗口。开始键入应用文件命令 shell脚本 AppleScript <的前几个字符/ em>等,按回车键,调用该命令。

LaunchBar 创建所有文件的索引,以便快速访问整个文件系统以及其他一些特定于应用程序的细节,例如:移动文件 copy文件调整文件大小播放歌曲跳过歌曲添加提醒/备注谷歌搜索与整个操作系统紧密集成附加文本,有趣的是,您可以创建.tgz个文件。

当我完成一个项目时,我不再希望它在我的索引中 - 我可以打开索引并排除该项目显示在 LaunchBar 中,但是 LaunchBar 努力隐藏自己及其应用程序包( .app ),甚至更难隐藏搜索索引管理器。足够的是操作太频繁而且心理记忆开销过多,加上在索引中定位文件是我经常做的事情,不能自动化该过程。

我养成了使用tar归档已完成项目的习惯。我在同一命令中使用g标志gziptar文件。

tar论证中使用领先短划线的官方立场是什么?我看到它有三种方式: no leading dash 引导破折号引导破折号,每个参数单独使用。

我的命令

tar cvfz "project.tgz" "project"`; mv "project" ~/.Trash

mv原始文件在〜/ .Trash与rm中的情况下tar失败或我需要做最后一分钟的更改。

我有一个脚本可以查找超过2周的所有.tgz个文件以及rm个文件,因为那时我还没有触及它们并且觉得删除它们是安全的。 (*我没有使用&#34;清空垃圾桶&#34;由操作系统提供,但根据文件年龄选择性删除文件(rm)扩展

我有一个多级备份系统。 (现场和远程)我不会在 LaunchBar索引/首选项 - LaunchBar 的索引更改中浪费大量时间通常,手动排除已完成的项目是不可行的。 LaunchBar 的优势在于它能够非常快速地添加和删除索引,所有这些都具有3MB以下的内存开销。

问题/问题

当我解压其中一个tar档案时,结果不符合预期。如果项目住在:     /Users/me/Documents/Jobs/GitHub/In-Progress/Project-Name我创建了一个名为&#34; cats.tgz &#34;的tar文件。我通过双击文件解压缩 - OS X有一个可以解压缩的本机应用程序。 targzipzip以及其他许多人,在维护文件元数据时,最终结果是名为&#34; cats &#的目录34 ;.

打开该目录,我看到tar已将目录的整个目录树创建回根驱动器。所以&#34; cats &#34;,一旦解压缩,就会变成以下目录结构:

/Volumes/drive-name/Users/me/Documents/Jobs/GitHub/In-Progress/Project-Name/cats/all-my-cats-files. 

每个目录都是空的,除了它的父目录,它必须是,或tar命令将花费相当多的时间来收拾&#34; &#34;,&#34; 文件&#34;和&#34; 正在进行中&#34;目录。

好像那是:

mkdir -P /Volumes/drive-name/Users/me/Documents/Jobs/GitHub/In-Progress/Project-Name/cats

...在tar命令之前运行的命令,源指向项目名称,目标指向空目录的长目录树。

我很少很少在成千上万的{{​​1}},tartgz以及我已解压缩的其他压缩/组合档案中看到此内容这些年。

如果您想以特定的方式解压缩归档以维护目录路径结构,我可以看到这很方便 - 可能使用项目中使用的文件,某些文件和目录可能需要位于特定位置。例如:项目代码中的调用可以找到〜/ bin / some-command,但是路径是错误的,因为root(/)现在只是我&#34; In-中目录内的一个目录。进度&#34;目录。

结论和结束思路

我错过了一面旗帜吗?是否需要或不需要在我的zip命令中使用尾部斜杠?

  • 这是MarkDown( .md )中为数不多的冒险之一,出于某种原因......我可能在移动设备上输入此内容,但我不会看到MarkDown的预览 - &gt;呈现HTML显示。

难倒... tar的任何常规用户都有任何建议吗?我的直觉告诉我,不能一次性使用tar命令可以解决这个问题。而是将它作为gzip的两部分过程,在完成调用tar时完成操作。我无法看到它是gzip因为它只接受一个参数,文件名并压缩它。 压缩侵略性有一个标志,但我总是只坚持默认值。

2 个答案:

答案 0 :(得分:1)

Mac OS X和GNU tar:

在解压缩/解包时删除前导目录级别(及其内容):

tar --strip-components=10 -xvzf "project.tgz"

答案 1 :(得分:0)

我想我想通了,你需要cd进入你要tar目录的目录,那么它只是一个单独的目录,当解压缩时,只会你想要什么,所以:

#!/bin/sh

if [ $# -eq 1 ]; then
    dirname=`dirname "$1"`
    filename=`basename "$1"`

    cd "$dirname"
    tar -czf "$filename".tar.gz "$filename"

    echo $dirname/$filename.tar.gz
fi

cd "$dirname"非常重要