Я пишу сценарий для копирования файлов с символами, не поддерживаемыми Office365, в папку кэша на OSX перед удалением символов (эта часть опущена). Это работает за исключением файлов, таких как:

p\\ophaddy.jpg

где то же самое интерпретирует обратную косую черту как пробел и терпит неудачу по понятным причинам. Попытка выяснить наиболее эффективный способ сделать это.

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 ответ1

0

Я использую 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 piping , а не -exec bash /c ... , который требует большой осторожности при использовании цитирования и экранирования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .