У меня есть набор файлов как FileNameX.cpp
и я хотел бы переименовать всех их к их соответствующему file_name_x.cpp
.
Эта команда удара делает задание. Из командной строки введите папку и выполните эту строку:
for file in ./* ; do mv "$file" "$(echo $file|sed -e 's/\([A-Z]\)/_\L\1/g' -e 's/^.\/_//')" ; done
В форме сценария это похоже на это:
#!/bin/bash
for file in ./* ; do
mv "$file" "$(echo $file|sed -e 's/\([A-Z]\)/_\L\1/g' -e 's/^.\/_//')"
done
В основном sed
используется для управления строками. Существует два выражения:
s/\([A-Z]\)/_\L\1/g
: поиски прописных букв к заменяют ими нижний регистр, и добавьте подчеркивание
s/^.\/_//
: удаляет любое подчеркивание, которое было вставлено из-за первой буквы, являющейся капиталом (т.е. Вы не хотите _file_name_x.cpp
.
Рассмотреть использование -v
, --verbose
на mv для объяснения, что делается.