太棒了;

太棒了;

太棒了;

我想在外部硬盘驱动器上运行脚本,并将每个以 tar.gz 结尾的文件夹.app放入自己的存档中。也就是说,我不想将它们全部放在一个 tar.gz 文件中,我想为每个文件夹创建一个。

我可以通过以下方式生成要处理的文件夹列表:

find /Volumes/External1 *.app -prune -print

我现在想将其中每一个压缩到自己的存档中。

第二部分是,我想复制所有这些文件以及驱动器上的所有其他文件,包括存档,但不复制它们相关的文件夹,并将它们全部复制到另一个位置。

更多信息

我创建了一个 Linux raid 盒子来充当我的网络的文件服务器。我主要使用 Apple 和 Linux 设备,尽管偶尔也有 Windows 设备可以连接。

我一直遇到的问题是 OSX .app 文件实际上是一个文件夹,并且它具有复杂的底层结构。

我一直在收集网络中的所有驱动器并将它们备份到文件服务器。我通常在 OSX 机器上对它们运行 MD5 哈希,然后在 Linux 中我将使用 MD5DEEP 来确认哈希。

实际问题是,在处理 .app 文件夹时,目录计数和文件大小几乎从不对齐。其他一切都完美匹配,除了当它到达这些文件夹之一时。

为了简化一切,我现在正在尝试做的是为每个 .app 文件夹创建一个 tar.gz 文件,并将它们保留在当前位置(即与 .app 文件夹位于同一位置),我将存储 tar 文件而不是 .app 文件夹。这样它就是一个单一文件,易于散列、复制、重新散列。

我终于找到了我想要使用的文件列表,我可以使用这些文件生成:

find /Volumes/External1 -name *.app -prune -print 

最后两个步骤

1.创建存档

这是我的第一个症结所在:我不想为所有这些文件夹创建一个存档。我想要每个文件夹一个存档。因此,从生成的列表扩展,如何将列表推送到单独创建的档案中?

2.移动驱动器中的所有内容

该驱动器被格式化为 Mac OSX(日志式)格式,因此我将通过千兆位网络移动这些文件,而不是实际将外部驱动器插入 Linux 盒子(我知道有一种方法/黑客可以关闭日志记录,请执行以下操作):副本,然后重新打开它,但我不知道这样做的影响,因此,我不想让它在一夜之间运行)。

当我生成复制命令时(我可以从任一端的终端执行此操作),我基本上想要匹配复制的命令行:

  • 任何类型的驱动器上的文件和文件夹,除了
  • 文件夹名称以“.app”结尾
  • 不是位于此类文件夹中的文件或文件夹
  • 并确保包含存档

为此我想出了:

find /Volumes/External1/ | grep -v '.app/'

我可以直接使用它或将其发送到文件并使用该列表。我认为文件列表更好,因为它为我提供了某种程度的“这些是我所做的工作”

我的想法

  • 生成所有 .app 文件夹的文件列表(列表 1)

    find /Volumes/External1/ -name *.app -prune -print > files.apps.list

  • 运行一个脚本,将列表 1 中的每个文件夹压缩为存档(保留原始文件夹不变)

    谢谢你的帮助

  • 生成第二个文件列表,不包括 .app 文件夹(列表 2)

    find /Volumes/External1/ | grep -v '.app/' > files.noapps.list

  • 在列表 2 上运行一个脚本,通过网络移动每个文件

    再次得到您的帮助,谢谢

我认为这两个步骤都扩展了find我可以通过-exec每个步骤使用tar和生成的列表cp,但我现在不知道如何将它们放在一起。

预先感谢

答案1

find运行归档程序。

find /Volumes/External1/ -name *.app -prune -exec script_to_archive_and_move {} \;

其中script_to_archive_and_move是一个可执行文件,它将名称.app作为参数,将其存档,然后将存档文件移动到其最终目的地。通过这种方法,您find根本不需要第二个命令。

相关内容