Bash脚本遍历文件夹树并从包中提取文件

时间:2017-02-25 20:56:00

标签: bash bundle

多年来,我一直在使用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. “unbundle”归档包
  4. 使用存档包的名称加上日期戳重命名“非捆绑”文件,剥离时区偏移量
  5. 因此,例如......对于名为“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脚本编写,而我想要做的就是现在的头脑,所以任何帮助都会受到赞赏。我认为这不应该那么难,但我可能对此很天真......

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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 "{}"' \;