Символьные ссылки пакетного обновления рекурсивно

У меня есть веб-приложение, которое имеет набор символьных ссылок в подкаталогах всюду по нему. Я должен переместить приложение в другую структуру каталогов, и я должен обновить все символьные ссылки для указания на новый путь. Например:

Старый 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/?

10
задан 28.06.2010, 19:11

2 ответа

Эта команда удара должна сделать это для Вас:

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
14
ответ дан 07.12.2019, 12:43

Я закончил тем, что писал Сценарий 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";
            }
        }
    }
}
?>
0
ответ дан 07.12.2019, 12:43

Теги

Похожие вопросы