如何使用文件名带反斜杠的 ditto 复制文件

如何使用文件名带反斜杠的 ditto 复制文件

我正在编写一个脚本,将包含 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 ...,这需要比使用引用和转义更加小心。

相关内容