停止 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 )并弹出一个小窗口。开始输入 app、file、command、shell 脚本、AppleScript 等,按回车键,命令被调用。
LaunchBar 创建所有文件的索引,以便快速访问整个文件系统以及其他一些特定于应用程序的细节,例如:移动文件、复制文件,调整文件大小,播放歌曲,跳过歌曲,添加提醒/笔记,google 搜索,与整个操作系统紧密集成,附加文本,有趣的是,您可以创建.tgz
文件。
当我完成一个项目后,我不再希望它出现在我的索引中 — 我可以打开索引并排除该项目出现在 LaunchBar 中,这可行,但 LaunchBar 努力隐藏自己和它的应用程序包 (.app ),甚至更难以隐藏 搜索索引管理器。足够频繁的操作和太多的精神记忆开销,加上在索引中定位文件是我经常做的事情,而不是自动化过程。
我已经养成使用tar
归档已完成项目的习惯。我在同一命令中将g
标志用于gzip
和tar
文件。
在tar
参数中使用前导破折号的官方立场是什么?我已经看到它以三种方式完成:没有前导破折号,前导破折号,前导破折号,每个参数单独使用。
我的命令
tar cvfz "project.tgz" "project"`; mv "project" ~/.Trash
我 mv
将原始文件放在 ~/.Trash 中,而不是 rm
'ing 它们,以防 tar
失败或我需要在最后一刻进行更改。
我有一个脚本可以找到所有超过 2 周的 .tgz
文件和 rm
的文件,因为那时我还没有碰过它们,并且觉得删除它们是安全的。 (*我不使用操作系统提供的“Empty Trash”,而是根据文件 age 和 extension 选择性地删除文件(rm
)
我有一个多级备份系统。 (现场和远程)我不会在 LaunchBar Index/Preferences 上浪费大量时间——LaunchBar 的索引变化足够频繁手动排除已完成的项目是不可行的。 LaunchBar 的 优势在于它能够极快地从索引中添加和删除,所有这些都只需不到 3MB 的内存开销。
问题/问题
当我解压其中一个tar
档案时,结果与预期不符。如果一个项目位于:
/Users/me/Documents/Jobs/GitHub/In-Progress/Project-Name
我创建了一个名为“cats.tgz”的tar
文件,我通过双击该文件来解压该文件——OS X 有一个可以解压的本机应用程序。 tar
、gzip
、zip
等等,在维护文件元数据的同时,最终的结果是一个名为“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
命令之前运行的命令,源指向项目名称,目标指向一长串空目录。
我很少在我多年来解压的数千个 tar
、tgz
、zip
和其他压缩/组合档案中看到这个。
如果您想以特定方式解压缩档案以维护目录路径结构,我可以看到这很方便 - 也许对于您项目中使用的文件,某些文件和目录可能需要位于特定位置.例如:您的项目代码中的调用可以找到 ~/bin/some-command,但路径将是错误的,因为 root ( / ) 现在只是我的“In-Progress 中的目录中的一个目录em>”目录。
结论和结语
我错过了一面旗帜吗?我的tar
命令中是否存在需要或不需要的尾部斜杠?
难倒……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` 命令在解包时创建完整目录路径 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
CentOS7 tar打包工具 打包,解包,打包压缩,打包解压缩