Как переименовать поврежденные расширения файлов оптом? - PullRequest
0 голосов
/ 11 февраля 2019

Для работы у меня есть автоматически генерируемый каждую неделю отчет (написанный инженером, а не мной), в который заносятся различные документы.Все они являются .docx, но в любом отчете примерно половина возвращается как «.docx [RANDOM CHARACTERS]», из-за чего их невозможно открыть, пока я не исправлю расширение файла для каждого из них вручную.Я видел, как массово переименовывать файлы (например, «.txt to .docx» через доску), но есть ли способ использовать Терминал, чтобы категорически изменить расширения для всех файлов в папке?

Попробовал этот код:

for file in *.docx*; do mv "$file" "$file%.docx}.docx"; done

Это добавило ".docx" в конец каждого имени файла, но не удалило все случайные символы.

В идеале он должен был бы заменить ".docx [RANDOM CHARACTERS]" на ".docx", оставив остальные файлы ".docx" в покое.

1 Ответ

0 голосов
/ 12 февраля 2019

Ты такой, такой близкий.В вашем выражении ${file%.docx} отсутствует * в конце шаблона .docx.* будет сопоставлять (а затем удалять) любые дополнительные символы, следующие за строкой .docx.Вот как это должно быть:

  for file in *.docx* ; do mv "$file" "${file%.docx*}.docx" ; done

Вы можете сделать команду немного более эффективной, выбрав только файлы, имя которых содержит хотя бы один символ после строки .docx, например:

  for file in *.docx?* ; do mv "$file" "${file%.docx*}.docx" ; done

Без этого ? команда будет соответствовать, а затем переименовать существующие файлы .docx с тем же именем, что и у них уже есть.Это безвредно, но неэффективно.

Очевидно, что если существует опасность, что переименование приведет к сбою существующего файла (например, у вас есть файлы с именами abc.docx и abc.docx2) или что два переименования столкнутся (например, у вас есть файлы)с именами xyz.docx1 и xyz.docx2), тогда вам придется сделать что-то более сложное.Использование mv -nv вместо простого mv было бы простым способом защиты от таких столкновений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...