У меня есть скрипт bash, который я пытаюсь получить, чтобы заменить точки в именах файлов и заменить их подчеркиванием, оставив расширение без изменений (я на Centos 6, кстати). Как видно из приведенного ниже вывода, сценарий работает, когда необходимо заменить точку, но в тех случаях, когда единственной точкой является расширение, сценарий все равно пытается переименовать файл, а не игнорировать его. Кто-нибудь может указать, как я должен справиться с этим лучше? Спасибо за любую помощь.
Мой (неисправный) скрипт:
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
Пример ввода:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
Вывод:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
tar.gz
файлы? Вы бы хотели, чтобы они решилиfile.tar.gz
, а неfile_tar.gz
.Ответы:
Я считаю, что эта программа будет делать то, что вы хотите. Я протестировал его, и он работает в нескольких интересных случаях (например, без расширения вообще):
Главная проблема, с которой вы столкнулись, заключалась в том, что
##
расширение не делало то, что вы хотели. Я всегда рассматривал расширение параметров оболочки в bash как нечто черное. Объяснения в руководстве не совсем ясны, и в них отсутствуют какие-либо подтверждающие примеры того, как расширение должно работать. Они также довольно загадочны.Лично я написал бы небольшой сценарий, в
sed
котором игралась бы имя так, как я хотел, или написал бы небольшой сценарий,perl
который просто делал все это. Один из тех, кто ответил, принял этот подход.Еще одна вещь, на которую я хотел бы обратить внимание - это использование цитат. Каждый раз, когда я что-то делаю с помощью сценариев оболочки, я напоминаю людям, что нужно быть очень осторожными с их цитированием. Огромный источник проблем в сценариях оболочки - оболочка, интерпретирующая вещи, которые она не должна делать. И правила цитирования далеко не очевидны. Я полагаю, что этот скрипт не содержит проблем с цитированием.
источник
Используйте
for thisfile in *.*.*
(то есть, переберите файлы с двумя или более точками в имени). Не забудьте процитировать ваши переменные и использовать--
для обозначения конца опций, как вmv -- "$thisfile" "$newname.$extension"
С зш.
источник
Как насчет этого:
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: попробуйте сначала фиктивный каталог, я не проверял!
источник
/
.Похоже, некоторые хорошие ответы уже доступны, но вот еще одно использование
tr
иsed
:источник
sed
решить, к чему.*
применить максимальный вкус? Я чувствую себя намного лучше об этом , если второй.*
был[^_]*
.\t
символами в нем.echo -n "$file"
должно сработать. :-) Да, и"
вокруг$( ... )
выражения (ака"$( ... )"
) будет делать это.Эта версия позволяет вам явно выбрать количество точек, которые вы хотите сохранить, начиная с правой стороны.
Кроме того, он заменяет и / или удаляет другие символы в дополнение к точкам, а символ замены
-
вместо подчеркивания, но это можно легко изменить.источник