удалить двойные расширения в bash

Я знаком с rename, но мне было любопытно, по-прежнему ли rename применяется для удаления дубликатов расширений??

скажем, у меня есть несколько файлов с именем:

  • picture2.формат jpg.формат JPG
  • picture9.формат jpg.формат JPG
  • picture3.формат jpg.формат JPG
  • picture6.формат jpg.формат JPG

Как бы вы удалили дубликат расширения??

конечный результат:

  • picture2.формат JPG
  • picture9.формат jpg
  • picture3.формат JPG
  • picture6.формат JPG

3 ответов


предположим:

  • вы хотите выполнить это только в текущем рабочем каталоге (нерекурсивно)
  • двойные расширения имеют формат точно как .jpg.jpg:

тогда будет работать следующий скрипт:

#!/bin/bash

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

объяснение:

чтобы использовать этот скрипт:

  • создать новый файл с именем clean_de.sh в каталоге
  • установите его в исполняемый файл chmod +x clean_de.sh
  • затем запустите его ./clean_de.sh

предупреждение:

как указал @gniourf_gniourf, используйте если mv поддерживает его.

в противном случае-если у вас есть a.jpg и a.jpg.jpg в том же каталоге он переименует a.jpg.jpg to a.jpg и в процессе переопределения уже существующих a.jpg без предупреждения.


одной команды переименования строки также должно быть достаточно (по крайней мере, для вашего случая):

rename 's/\.jpg\.jpg$/.jpg/' *.jpg.jpg

вот более общее, но все же простое решение этой проблемы:

for oldName in `find . -name "*.*.*"`; do newName=`echo $oldName | rev | cut -f2- -d'.' | rev`; mv $oldName $newName; done

краткое описание:
find . -name "*.*.* - это найдет только файлы с повторяющимися расширениями рекурсивно

echo $oldName | rev | cut -f2- -d'.' | rev - трюк происходит здесь: команда rev делает реверс на строке, так что теперь вы можете видеть, что вы хотите, чтобы все имя файла с первой точки. встык (gpj.gpj по.fdsa)

mv $oldName $newName - фактически переименовать файлы

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