Заменить расширение динамического файла на фиксированное расширение файла

Предполагая, что у вас нет имен файлов с символами новой строки:

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4 \
     -exec sh -c 'echo "${1%/*}"' _ {} \; | sort -u | \
          xargs -d $'\n' -I{} rm -r {}/thumbnails
  • Расширение параметра, $ {1% / *} извлекает часть без имени файла из каждой найденной записи

  • sort -u сортирует, а затем делает записи уникальными, чтобы у нас не было дубликатов

  • xargs -I {} rm -r {} / эскизы добавляет эскизов в конец, а затем удаляет результирующий каталог

2
06.01.2017, 13:48
3 ответа

В bash простой цикл с некоторыми манипуляциями со строкой

for f in ./*.ZIP.*
do
   mv "$f" "${f%.*}"
done

«$ {f%. *}» удаляет все, что находится после последнего . (включительно) в строке в $ f .

3
27.01.2020, 21:56
for filename in $(find . -name '*ZIP*'); do mv $filename $(echo $filename | sed 's|\(.*\)\.ZIP.*|\1.ZIP|g') ; done
1
27.01.2020, 21:56

В команде perl, основанной на rename:

$ touch 08242016G0040156.ZIP.20160907141452 09042016SHOC0003.ZIP.20160904044504

$ rename -n 's/\.\d+$//' *ZIP*
rename(08242016G0040156.ZIP.20160907141452, 08242016G0040156.ZIP)
rename(09042016SHOC0003.ZIP.20160904044504, 09042016SHOC0003.ZIP)

-n опция предназначена для пробного запуска. Если переименование проходит нормально, удалите ее для реального переименования


Если файлы могут находиться в нескольких подкаталогах, используйте find

find -name '*ZIP*' -exec rename -n 's/\.\d+$//' {} +


Если после последнего идут символы, отличные от цифр. используйте

rename -n 's/\.[^.]+$//' *ZIP*
1
27.01.2020, 21:56

Теги

Похожие вопросы