我正在编写一个脚本,将包含 Office365 不支持的字符的文件复制到 OSX 上的缓存文件夹,然后删除这些字符(省略该部分)。除了以下文件的情况外,此方法有效:
p\\ophaddy.jpg
其中 ditto 将反斜杠解释为空格,因此失败是可以理解的。尝试找出最有效的方法。
find $HOME -not \( -path "$HOME/Library" -prune \) -not \( -path "$HOME/Cache" -prune \) -not \( -path "$HOME/.Trash" -prune \) -name "*[<>:/|?#%\\\]*" -exec bash -c 'x="{}" && echo $x && ditto "$x" $HOME/Cache/ ; y=$(sed "s/[<>:|?#%\\\]\+/-/g" <<< "$x") ' \;
答案1
我使用 Ubuntu,所以我没有ditto
,但以下内容应该有效:
find $HOME -not \( -path "$HOME/Library" -prune \) \
-not \( -path "$HOME/Cache" -prune \) \
-not \( -path "$HOME/.Trash" -prune \) \
-name "*[<>:/|?#%\\\]*" | while read -r; \
do cp --parent --preserve-all "${REPLY}" "$HOME/Cache/${REPLY/[<>:|?#%\\]/-}"; \
done
笔记:-
- 为了便于阅读,我把命令分散到几行。
- 这并不能完全实现您想要实现的目标:上面的代码将每个无效字符替换为
-
,而您尝试将每个无效字符序列替换为一个-
,但两者都会产生与 Office 兼容的文件。 - 一般来说,我更喜欢使用管道连接到
read
,而不是-exec bash /c ...
,这需要比使用引用和转义更加小心。