У меня проблема с некачественным PHP-проектом (я его не написал :)) и переход на файловую систему linux, то есть в отличие от чувствительности к регистру в Windows. Включения и имена изображений несколько несовместимы с реальными именами файлов, что мне нужно своего рода автоматическое решение.
Поэтому я подумал о скрипте, который рекурсивно анализирует каталог проекта для файлов php, js, jpg и gif и заменяет все вхождения файла с неправильным регистром на реальное имя файла в файлах php проекта.
алгоритм будет выглядеть так:
foreach (php, js, jpg, png, gif ..) как $ найдено в dir: найти все php в dir: заменить ignoreCase ($ found) на $ found
я пытался написать это с помощью Perl и File :: Find, но я в настоящее время застрял: /
Вы можете сделать это с помощью командной строки, используя 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
Других решений пока нет …