У меня есть веб-приложение, которое имеет набор символьных ссылок в подкаталогах всюду по нему. Я должен переместить приложение в другую структуру каталогов, и я должен обновить все символьные ссылки для указания на новый путь. Например:
Старый Dir: /home/user/public_html/dev
Новый Dir: /home/user/public_html/qa
Старая символьная ссылка: /home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/dev/images
Новая символьная ссылка: /home/user/public_html/qa/multisites/slave01/images -> /home/user/public_html/qa/images
Проблема состоит в том, что существуют многие из них рассеянных всюду по различным каталогам. Как я могу рекурсивно искать от корня и воссоздать все символьные ссылки, указывающие /dev/
с /qa/
?
Эта команда удара должна сделать это для Вас:
find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*' -printf 'ln -nsf "$(readlink "%p" | sed s/dev/qa/)" "$(echo "%p" | sed s/dev/qa/)"\n' > script.sh
Это использует find
определить все файлы в qa
каталог, которые являются символьными ссылками с целью, это находится в dev
каталог, и для каждого, это распечатывает команду удара, которая заменит ссылку со ссылкой на эквивалентный путь в qa/
. После выполнения этого просто выполните сгенерированный сценарий с
bash script.sh
Вы могли бы хотеть исследовать его вручную сначала, чтобы удостовериться, что это работало.
Вот более подробная версия вышеупомянутого find
команда для более легкого чтения (хотя я не обязательно записал бы этому этот путь на практике):
SRC_DIR="/home/user/public_html/qa"
OLD_TARGET="/home/user/public_html/dev"
SUB="s/dev/qa/"
find $SRC_DIR -type l \
-lname "$OLD_TARGET/*" -printf \
'ln -nsf "$(readlink "%p"|sed $SUB)" "$(echo "%p"|sed $SUB)"\n'\
> script.sh
Я закончил тем, что писал Сценарий PHP командной строки, который, кажется, добивается цели.
<?php
//Run via command-line
$dir = new RecursiveDirectoryIterator('.');
foreach(new RecursiveIteratorIterator($dir) as $file) {
//$link = readlink($file);
if(is_link($file)) {
$old_link = readlink($file);
$new_link = str_ireplace("/joomla/", "/qa/", $old_link);
if($new_link != $old_link) {
exec('rm "'.$file.'"');
exec('ln -fs "'.$new_link.'" "'.$file.'"');
$new_link = readlink($file);
if($new_link == $old_link) {
echo $file."\t".$old_link."\t".$new_link."\n";
}
}
}
}
?>