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

用于遍历文件夹树并从包中提取文件的Bash脚本,bash,bundle,Bash,Bundle,多年来,我一直在使用一个OSX存档应用程序,它将以前版本的文档存储在一个OSX捆绑包中。此应用程序与Sierra不兼容,但我不想丢失所有文件存档 以下是文件文件夹结构: Dir1 |--document_archive_1 <--has name of original document | --doc_version_1 <--has name in form: 20160301 180206 -0800 | --doc_version_2 <--has na

多年来,我一直在使用一个OSX存档应用程序,它将以前版本的文档存储在一个OSX捆绑包中。此应用程序与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. 
我只写了一点Bash脚本,我想做的是超出我目前的能力范围,所以任何帮助都将不胜感激。我想这应该没那么难,但我可能对此很幼稚


感谢您的帮助。

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) stock OS X安装没有realpath命令。根据我在网上的发现,我替换了readlink e。我不确定它们是否真的相等。(2) 所有mv命令都会导致“权限被拒绝”,尽管在检查权限时,我是所有者。mv命令也导致了奇怪的名字。例如,mv:rename./CAMNER.QDF.synkrachive/20120609 153635-0700 to/CMIOUnits_uuuuuuuuu:和mv:rename./CAMNER.QDF.synkrachive/20120609 153635-0700 to/EDEL_uuuu:和mv:rename./CAMNER.QDF.synkrachive/20120609 153635-0700 to/appleIntermediate codec_uuuuu:是的,重命名没有正确执行。我已经编辑了脚本,现在应该可以了。
|folder called 'letter_to_dad'
|--letter_to_dad 20160301 180206.doc
|--letter_to_dad 20151127 171422.doc
#!/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 "{}"' \;