Ты такой, такой близкий.В вашем выражении ${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
было бы простым способом защиты от таких столкновений.