【问题标题】:Bash script to traverse folder tree and extract files from bundles用于遍历文件夹树并从包中提取文件的 Bash 脚本
【发布时间】:2017-02-27 14:52:42
【问题描述】:

多年来,我一直在使用一个 OS X 归档应用程序,它将以前版本的文档存储在一个 OS X 包中。此应用与 Sierra 不兼容,但我不想丢失所有文件存档。

这是文件夹结构:

Dir1
|--document_archive_1 <--has name of original document
|  --doc_version_1    <--has name in form: 20160301 180206 -0800
|  --doc_version_2    <--has name in form: 20151127 171422 -0800
|--document_archive_2
|  --doc_version_1    
|subdir1
|   --document_archive_3
|   subsubdir
etc. 

或者,换句话说,树中的每个文件夹都包含子文件夹和 OS X 捆绑包的组合,其中包含存档文档版本(仅此而已)。该包的文件名是其归档版本所在的文档的文件名。归档包包含名称为日期戳的文件。

我想做的是遍历文件夹树。当我遇到归档包时,我想:

  1. 创建一个文件夹,其名称是归档包的名称
  2. 将归档包移动到步骤 2 中创建的文件夹中
  3. “解包”归档包
  4. 用存档包的名称加上日期戳重命名“未捆绑的”文件,去掉时区偏移

因此,例如...对于名为“letter_to_dad.doc”的 Word 文档,归档包名为“letter_to_dad.doc.synkarchive”,如下所示:

|letter_to_dad.doc.synkarchive
|--20160301 180206 -0800 <--this is a .doc file but has no extension
|--20151127 171422 -0800

我想结束的是:

|folder called 'letter_to_dad'
|--letter_to_dad 20160301 180206.doc
|--letter_to_dad 20151127 171422.doc

我只写了一点 Bash 脚本,我想做的事情已经超出了我目前的想法,因此我们将不胜感激。我在想这不应该那么难,但我可能对此很天真......

感谢您的帮助。

【问题讨论】:

    标签: bash bundle


    【解决方案1】:

    AFAIK 包只是文件夹,所以下面的脚本应该可以解决问题:

    #!/usr/bin/env bash
    
    bundle_root=${HOME}
    out_root="/tmp"
    
    function copy_bundle {
        bn="$(basename "$1")"
        bn=${bn%%.*}
        new_dir="${out_root}/${bn}"
        mkdir "${new_dir}" 2>/dev/null
        rsync -a "$1" "${new_dir}"
        find . -type f | xargs -I% mv % "${new_dir}/${bn}_$(echo % | sed -Ee 's,[[:space:]]+,_,g' -e 's,_(-|[[:alnum:]])+$,,')"
    }
    
    export out_root
    export -f copy_bundle
    
    find "${bundle_root}" -iname "*.bundle" -type d -exec bash -c 'copy_bundle "{}"' \;
    

    【讨论】:

    • 谢谢。问题... (1) 普通的 OS X 安装没有 realpath 命令。根据我在网上找到的内容,我替换了 readlink e。我不确定它们是否真的等价。 (2) 所有 mv 命令都导致“权限被拒绝”,尽管在检查权限时,我是所有者。 mv 命令也导致了奇怪的名称。例如。 mv: 重命名 ./CAMNER.QDF.synkarchive/20120609 153635 -0700 到 /CMIOUnits__: AND mv: 重命名 ./CAMNER.QDF.synkarchive/20120609 153635 -0700 到 /EDEL__: AND mv: 重命名 ./CAMNER.QDF.synkarchive /20120609 153635 -0700 到 /AppleIntermediateCodec__:
    • 是的,重命名没有正确实现。我已经编辑了脚本,现在应该没问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多