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

Stop the Unix `tar` command from creating a full directory path on unpacking

背景

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

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

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

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

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

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

我的命令

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

如果tar失败或我需要在最后一分钟进行更改,我会将~/.trash中的原始文件与rm中的原始文件进行对比。

我有一个脚本,可以找到所有超过2周的.tgz文件和rm文件,因为那时我还没有碰过它们,觉得删除它们是安全的。(*我不使用操作系统提供的"空垃圾桶",但根据文件期限和扩展名有选择性地删除文件(rm)

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

问题/问题

当我打开一个tar档案时,结果与预期不符。如果项目位于:我创建了一个名为"cats.tgz"的tar文件,双击该文件即可解包—OS X有一个可以解包的本地应用程序。targzipzip等,在维护文件元数据的同时,最终得到一个名为"cats"的目录。

打开我看到的那个目录tar创建了一个完整的目录树,其中包含空目录,返回到根驱动器。因此,"cats"一旦解包,就变成了一个目录结构:

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

除了父目录之外,每个目录都是空的,否则tar命令将花费大量时间来打包"me"、"documents"和"in progress"目录。

好像有一个:

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

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

在我多年来打开的数千个tartgzzip和其他压缩/组合档案中,我很少看到这种情况。

我可以看到,在您希望以特定方式解包存档以维护目录路径结构的情况下,这很方便——也许对于项目中使用的文件,某些文件和目录可能需要位于特定位置。例如:项目代码中的调用可以找到~/bin/some命令,但是无论根目录是什么,路径都是错误的(/)现在只是我的"进行中"目录中目录内的一个目录。

结语与结语

我缺旗了吗?我的tar命令中是否有一个需要或不需要的尾随斜线?

  • 这是Markdown(.md)中极少数的冒险之一,出于某种原因……可能是我在移动设备上键入的,我看不到Markdown->Rendered HTML显示的预览。

难住了…有没有经常使用tar的用户有什么建议?我的直觉告诉我,一次不使用gzip命令可以解决这个问题。相反,它是tar的两部分过程,完成时调用gzip来完成操作。我看不出它是gzip,因为这只需要一个论点,t


Mac OS X和GNU tar:

解压缩/解包时删除主要目录级别(及其内容):

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

我想我知道了,你需要把cd放到目录里,目录就是你想把tar打开,那么它只是一个目录,当解包时,只有你想要的,所以:

1
2
3
4
5
6
7
8
9
10
11
#!/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"很重要