停止 Unix `tar` 命令在解包时创建完整目录路径 [关闭]

Posted

技术标签:

【中文标题】停止 Unix `tar` 命令在解包时创建完整目录路径 [关闭]【英文标题】:Stop the Unix `tar` command from creating a full directory path on unpacking [closed] 【发布时间】:2014-09-15 23:35:14 【问题描述】:

背景

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

LaunchBar 是由键盘命令调用的应用程序启动器。按命令空间( configurable )并弹出一个小窗口。开始输入 appfilecommandshell 脚本AppleScript 等,按回车键,命令被调用。

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

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

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

tar 参数中使用前导破折号的官方立场是什么?我已经看到它以三种方式完成:没有前导破折号前导破折号前导破折号,每个参数单独使用。

我的命令

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

mv 将原始文件放在 ~/.Trash 中,而不是 rm'ing 它们,以防 tar 失败或我需要在最后一刻进行更改。

我有一个脚本可以找到所有超过 2 周的 .tgz 文件和 rm 的文件,因为那时我还没有碰过它们,并且觉得删除它们是安全的。 (*我不使用操作系统提供的“Empty Trash”,而是根据文件 ageextension 选择性地删除文件(rm

我有一个多级备份系统。 (现场和远程)我不会在 LaunchBar Index/Preferences 上浪费大量时间——LaunchBar 的索引变化足够频繁手动排除已完成的项目是不可行的。 LaunchBar 的 优势在于它能够极快地从索引中添加和删除,所有这些都只需不到 3MB 的内存开销。

问题/问题

当我解压其中一个tar 档案时,结果与预期不符。如果一个项目位于: /Users/me/Documents/Jobs/GitHub/In-Progress/Project-Name 我创建了一个名为“cats.tgz”的tar 文件,我通过双击该文件来解压该文件——OS X 有一个可以解压的本机应用程序。 targzipzip 等等,在维护文件元数据的同时,最终的结果是一个名为“cats”的目录。

打开那个目录我看到tar 已经创建了一个完整的目录树回到根驱动器。所以“cats”一经解压,就变成了一个目录结构:

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

除了它的父目录之外,每个目录都是空的,否则tar 命令将花费大量时间来打包“me”、“Documents”和“In-Progress”目录。

好像有一个:

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

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

很少在我多年来解压的数千个 tartgzzip 和其他压缩/组合档案中看到这个。

如果您想以特定方式解压缩档案以维护目录路径结构,我可以看到这很方便 - 也许对于您项目中使用的文件,某些文件和目录可能需要位于特定位置.例如:您的项目代码中的调用可以找到 ~/bin/some-command,但路径将是错误的,因为 root ( / ) 现在只是我的“In-Progress 中的目录中的一个目录em>”目录。

结论和结语

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

这是对 MarkDown (.md) 的极少数冒险之一,出于某种原因……可能是我在移动设备上输入的,我没有看到 MarkDown 的预览-> 呈现 html 显示。

难倒……tar 的普通用户有什么建议吗?我的直觉告诉我不要一次性使用gzip 命令可能会解决这个问题。而是将其设为tar 的两部分过程,完成后调用gzip 来完成操作。我看不到它是gzip,因为它只接受一个参数,即文件名,并对其进行压缩。 压缩侵略性有一个标志,但我一直只坚持默认值。

【问题讨论】:

这些名称通常存在于 tar 本身中,并且通常应该都在一个目录中以防止 tar 轰炸您的 cd...如果您使用 @987654356,您可以在不扩展的情况下查看名称@开关 @Scott- 我不禁觉得你有点冗长。通常最好陈述您的问题并提出您的问题。我害怕这样的谩骂,我只是忽略了它们。 那么,您究竟想如何解决这个问题?您想知道如何创建不包含所有这些元素的档案吗?您想知道如何在 unpack 上抑制前导目录元素吗? (后者需要 GNU 扩展)。准确地决定你想知道什么,然后只问那个问题。简洁。在适当的论坛中(“我如何使用这个标准的 UNIX 命令?”通常比 *** 更适合 SuperUser)。 同意jww。在我们可以期望阅读它之前,这应该更短。不是我们懒惰;看看类似的问题,看看他们是如何在大约 1/4 的空间中提出这一点的。 【参考方案1】:

Mac OS X 和 GNU tar:

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

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

【讨论】:

【参考方案2】:

我想我想通了,你需要把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" 很重要

【讨论】:

以上是关于停止 Unix `tar` 命令在解包时创建完整目录路径 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

tar命令

Unix下 压缩和解压缩命令

CentOS7 tar打包工具 打包,解包,打包压缩,打包解压缩

linux中的tar命令

AVCaptureDeviceInput在解包Optional值时意外发现nil

Pyinstaller --onefile 模式,如何在解包前向控制台写入消息