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

问题描述:

多年来,我一直在使用OS X归档应用程序,它将先前版本的文档存储在OS X捆绑软件中。此应用程序与Sierra不兼容,但我不想丢失我的所有文件档案。Bash脚本遍历文件夹树并从捆绑中提取文件

这里的文件夹结构:

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 Word文档。 doc“一条弧线蜂巢包被命名为“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脚本写作,我想要做的是超过我目前的头,所以任何帮助将不胜感激。我在想,这应该不是那么难,但我可能对此太天真了......

感谢您的任何帮助。

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

谢谢。问题...(1)股票OS X安装没有realpath命令。根据我在网上找到的内容,我用readlink e取而代之。我不确定它们是否真的相当。 (2)所有的mv命令导致“权限被拒绝”,虽然在检查权限时,我是所有者。 mv命令也导致了奇怪的名字。例如。 mv:将./CAMNER.QDF.synkarchive/20120609 153635 -0700重命名为/ CMIOUnits__:AND mv:rename ./CAMNER.QDF.synkarchive/20120609 153635 -0700 to/EDEL__:AND mv:rename ./CAMNER.QDF.synkarchive/20120609 153635 -0700到/ AppleIntermediateCodec__: – camner

+0

是的,重命名没有正确实施。我编辑了脚本,现在应该没问题。 – mshrbkv