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捆绑的组合。该软件包的文件名为归档版本所在文档的文件名。归档包中包含名称为日期戳的文件。
我想要做的是遍历文件夹树。当我遇到一个归档包,我想:
- 创建一个名称的文件夹是归档束
- 移动存档束入一步创建2
- “松绑”的文件夹的名称归档包
- 重命名“分割”的文件与归档包的名称以及日期戳,剥离时区偏移
因此,例如...名为“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 "{}"' \;
谢谢。问题...(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
是的,重命名没有正确实施。我编辑了脚本,现在应该没问题。 – mshrbkv