Как копировать файлы с помощью ditto с обратными косыми чертами в именах файлов

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

pophaddy.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")   ' ;
5
задан rndy
источник

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 ..., который нуждается в большой осторожности по использованию цитирования и побега.
0
отвечен AFH 2016-10-14 18:13:34
источник

Другие вопросы bash find macos regex sed