2010-08-05 2 views
3

Когда мы разрабатываем локально, мы добавляем файлы «.dev» или «.prod» в файлы, которые должны быть доступны только для сервера разработки/производства соответственно.Рекурсивно удалить суффикс имени файла из файлов в оболочке

Что я хотел бы сделать: после развертывания сайта на сервере, рекурсивно найти все файлы с суффиксом «.dev» (например) и удалить его (переименовать файл). Как мне это сделать, желательно полностью в оболочке (без скриптов), чтобы я мог добавить ее в наш сценарий развертывания?

Наши серверы управляют Ubuntu 10.04.

+0

это уже ответили: http://stackoverflow.com/questions/2171966/bash-rename-extension-recursive – alfredodeza

+0

@alfredodeza: Спасибо за указание, что один из - я ничего не могу найти там (кроме сценариев оболочки), которые делают то, что я хочу. Однако некоторые хорошие ответы ниже. – Tom

ответ

3

Попробуйте это (не совсем оболочка только, требует find и mv утилиты):

find . '(' -name '*.dev' -o -name '*.prod' ')' -type f -execdir sh -c 'mv -- "$0" "${0%.*}"' '{}' ';' 

Если у вас есть rename и xargs утилиты, вы можете ускорить это много:

find . '(' -name '*.dev' -o -name '*.prod' ')' -type f -print0 | xargs -0 rename 's/\.(dev|prod)$//' 

Обе версии должны работать с любым именем файла, включая имена файлов, содержащие новые строки.

+0

+1, это лучше, чем у меня. Однако, если у вас есть действительно строгие требования к совместимости, вы можете быть уверены, что POSIX 'find' не имеет' -execdir' или '-print0', и я считаю, что' '$ {0% .dev}" ' багизм. – bcat

+0

Это, кажется, работает хорошо; Я заменил 's/\. Dev $/.prod /' на 's/\. Dev $ //', поскольку я ищу, чтобы полностью удалить расширение. Нет особых требований к совместимости, поэтому зависимость от rename/xargs не является проблемой. Благодаря! – Tom

+0

В manpage 'sh' говорится, что' sh' знает об удалении суффикса. '-execdir' может быть заменен на' -exec' (что, как сказано в man-странице Linux, менее безопасно), но '-print0' заменить невозможно. – Philipp

1
for file in `ls *.dev`; do echo "Old Name $file"; new_name=`echo $file | sed -e 's/dev//'` ; echo "New Name $new_name"; mv $file $new_name; done 

В примере то я использовал в последнее время этот код выглядит для любого файла, который заканчивается new.xml меняет дату в имя файла (имена файлов были формы xmlEventLog_2010-03-23T11: 16: 16_PFM_1_1.xml), удаляет _new от имени и переименовывает имя файла новое имя:

for file in `ls *new.xml`; do echo "Old Name $file"; new_name=`echo $file | sed -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/2010-03-23/g' | sed 's/_new//g'` ; echo "New Name $new_name"; mv $file $new_name; done 

это тип вещи вы хотели?

+0

Это не рекурсия в подкаталоги. – bcat

+0

И это не работает с именами файлов, содержащими ничего «специального» (пробелы, символы новой строки, непечатаемые символы ...). – Philipp

+0

просто пытается помочь. не потрудись сделать это на этом сайте снова – amadain

0

Это совершенно не проверялось, но это должно работать в POSIX-подобной оболочки выбор:

remove-suffix() { 
    local filename 
    while read filename; do 
     mv "$filename" "$(printf %s "$filename" | sed "s/\\.$1\$//")" 
    done 
} 

find -name '*.dev' | remove-suffix .dev 

Примечание: В очень необычном случае, когда один или несколько имен файлов содержит символ новой строки, this won't work.

0
find /fullpath -type f -name "*.dev"|sed 's|\(.*\)\(\.pdf\)|mv & \1.sometag|' | sh 
Смежные вопросы