удалить двойные расширения в 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
объяснение:
-
${file%.jpg}
: эта часть называется Subsitution Параметра. - из того же источника: " ${var%Pattern} Удалите из $var самую короткую часть $ Pattern, которая соответствует задней части $var."
- обратите внимание, что" шаблон", упомянутый здесь, называется globbing, который является отличается от регулярного выражения в значительной степени.
чтобы использовать этот скрипт:
- создать новый файл с именем
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
- фактически переименовать файлы
Примечания К Выпуску: поскольку это простой однострочный скрипт, вы можете найти необработанные случаи. Файлы с дополнительной точкой в имени файла, сверхглубокие структуры каталогов и т. д.