Рекурсивно удалить суффикс имени файла из файлов в оболочке - PullRequest
3 голосов
/ 05 августа 2010

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

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

На наших серверах работает Ubuntu 10.04.

Ответы [ 4 ]

3 голосов
/ 05 августа 2010

Попробуйте это (не только для оболочки, требуются утилиты 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)$//'

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

1 голос
/ 05 августа 2010
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 голосов
/ 05 августа 2010
find /fullpath -type f -name "*.dev"|sed 's|\(.*\)\(\.pdf\)|mv & \1.sometag|' | sh
0 голосов
/ 05 августа 2010

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

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

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

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

...