Миграция устаревшего проекта PHP из Windows в Linux (непоследовательная ситуация)

У меня проблема с некачественным PHP-проектом (я его не написал :)) и переход на файловую систему linux, то есть в отличие от чувствительности к регистру в Windows. Включения и имена изображений несколько несовместимы с реальными именами файлов, что мне нужно своего рода автоматическое решение.

Поэтому я подумал о скрипте, который рекурсивно анализирует каталог проекта для файлов php, js, jpg и gif и заменяет все вхождения файла с неправильным регистром на реальное имя файла в файлах php проекта.

алгоритм будет выглядеть так:

foreach (php, js, jpg, png, gif ..) как $ найдено в dir: найти все php в dir: заменить ignoreCase ($ found) на $ found

я пытался написать это с помощью Perl и File :: Find, но я в настоящее время застрял: /

1

Решение

Вы можете сделать это с помощью командной строки, используя find и гну-сед gsed,

#!/bin/sh

# Replace filenames found in code and create a backup of original
find . -type f \( -name "*.php" -or -name "*.jpg" \) -exec bash -c 'gsed -i.bak "s/\(\W\)`basename {}`\(\W\)/\1`basename {}`\2/Ig" /src/ *'  \;

########################
# Explanation
#   find
#     .               : Recursively from current directory,
#     -type f         : files only - not folders,
#     f\(..\)         : with extensions,
#     -ecec           : execute this command,
#     base -c         : and execute in bash after {} replacement
#   sed
#     -i              : Replace text in the actual file,
#     .bak            : but backup file to *.bak,
#     s/              : search for;
#       \W            : something beginning with a
#                       non word so we dont match test.img with
#                       otherTest.img, but will still match "test.img"#       `basename {}` : file name placeholder provided by find
#       \W            : does not end in a word so we dont match
#                       test.htm against test.html
#     /`basename {}`/ : Replace string from the search  with the
#                       string of the actual filename
#     g               : Global search, match more than just the first instance
#     I               : Case insensitive search
#     /src/*          : Full path to files sed will work on
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]