ব্যাচের আপডেট প্রতীকী লিঙ্কগুলি পুনরাবৃত্তভাবে


13

আমার একটি ওয়েব অ্যাপ্লিকেশন রয়েছে যার পুরো জুড়ে উপ-ডিরেক্টরিতে প্রতীকী লিঙ্ক রয়েছে links আমার অ্যাপ্লিকেশনটিকে অন্য ডিরেক্টরি কাঠামোয় স্থানান্তরিত করা দরকার এবং নতুন পথের দিকে ইঙ্গিত করার জন্য আমার সমস্ত সিমলিংকগুলি আপডেট করতে হবে। উদাহরণ স্বরূপ:

পুরাতন দির: /home/user/public_html/dev
নতুন দির: /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

সমস্যাটি হ'ল এখানে প্রচুর ছড়িয়ে ছিটিয়ে রয়েছে বিভিন্ন ডিরেক্টরিতে। আমি কিভাবে যাও recursively রুট থেকে অনুসন্ধান ও নির্দেশিত সব symlinks পুনঃ পারেন /dev/সঙ্গে /qa/?

উত্তর:


17

এই বাশ আদেশটি আপনার পক্ষে এটি করা উচিত:

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থাকা সমস্ত ফাইল সনাক্ত করতে ব্যবহার করে এবং প্রত্যেকটির জন্য এটি একটি বাশ কমান্ড প্রিন্ট করে যা সমতুল্য পথের লিঙ্কের সাথে লিঙ্কটি প্রতিস্থাপন করবে । আপনি এটি চালানোর পরে, কেবল এর সাথে উত্পন্ন স্ক্রিপ্টটি কার্যকর করুনqadevqa/

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

এটি একটি খালি স্ক্রিপ্ট তৈরি করে sh এবং ফাইন্ড কমান্ডটি যেমন চালাচ্ছে: find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*' কিছুই আউটপুট দেয় না।
ggutenberg

আপনি কি আপনার ফাইল সিস্টেমে প্রকৃত রাস্তাগুলি পরিবর্তন করার কথা মনে রেখেছেন, তাই না? সবে দৌড়ালে কী হয় find /home/usr/public_html/qa/ -type l? যদি এটি লিঙ্কগুলি খুঁজে না পায়, আপনার সিস্টেমে খুব অদ্ভুত কিছু চলছে।
ডেভিড জেড

হ্যাঁ, " find /home/user/public_html/qa/ -type l" লিঙ্কগুলি আউটপুট করে। তবে -lname পরামিতি যুক্ত করে এটি কিছুই আউটপুট দেয় না।
ggutenberg

আসলে, আরও পরীক্ষার সময় দেখে মনে হচ্ছে এটি কাজ করছে। গতকাল আমি কী ভুল করেছিলাম তা নিশ্চিত নন, তবে এখন ঠিক আছে বলে মনে হচ্ছে। ধন্যবাদ।
ggutenberg

হু, অদ্ভুত। ঠিক আছে, আপনি যদি কখনও ভুল হয়ে যাচ্ছেন তা যদি বুঝতে পারেন তবে এখানে একটি মন্তব্য দিন। আমি কৌতুহলী.
ডেভিড জেড

5

সমাধানের সন্ধানের সময় অন্য কেউ এটির সন্ধান করলে: "লিঙ্কমড.এসএস" নামের একটি ফাইল তৈরি করুন:

#!/bin/sh
PATTERN1=`echo "$2"`
PATTERN2=`echo "$3"`
LINKNAME=`echo "$1"`
OLDTARGET=`readlink "$1"`
NEWTARGET=`echo "$OLDTARGET" \
| sed -e 's/'"$PATTERN1"'/'"$PATTERN2"'/'`
echo ln -nsf "$NEWTARGET" "$LINKNAME"

এবং চালান

find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"

প্রয়োজনে সন্ধানে আপনি নাম-অপশনটি ব্যবহার করতে পারেন।

দ্রষ্টব্য: প্রতিধ্বনিতে যে কোনও অক্ষরের জন্য characters সেড প্রয়োজন হয় তার আগে আপনাকে প্যাটার্নগুলিতে 2x use ব্যবহার করতে হবে, যেহেতু প্রতিধ্বনি একটিটিকে মুছে ফেলে। উদাহরণ স্বরূপ

find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"

echoLn কমান্ডগুলি সঠিক হলে শেষ লাইনটি থেকে অপসারণ করুন ।


স্পষ্ট করে বলা যায় যে স্ক্রিপ্টেরecho চূড়ান্ত লাইন এবং কমান্ডের মধ্যে উভয়ই অপসারণ করা দরকার। echofind .. | xargs .. linkmod.sh ...
কাইল স্ট্র্যান্ড

2

আমি link_rename.shএকটি প্রদত্ত ডিরেক্টরিতে প্রতীকী নামগুলি পুনরাবৃত্ত করার জন্য একটি বাশ স্ক্রিপ্ট তৈরি করেছি

#! /bin/bash

DIR=$1
OLD_PATTERN=$2
NEW_PATTERN=$3

while read -r line
do
    echo $line
    CUR_LINK_PATH="$(readlink "$line")"
    NEW_LINK_PATH="$CUR_LINK_PATH"  
    NEW_LINK_PATH="${NEW_LINK_PATH/"$OLD_PATTERN"/"$NEW_PATTERN"}"
    rm "$line"
    ln -s "$NEW_LINK_PATH" "$line"
done <<< $(find "$DIR" -type l)

এটি হিসাবে কার্যকর করা যেতে পারে link_rename.sh /home/human/dir link1 link2

স্ক্রিপ্টটিতে 3 টি আর্গুমেন্ট রয়েছে:

  1. আপনি যে ডিরেক্টরিটিতে সিমলিংকের ব্যাচের নাম পরিবর্তন করতে চান
  2. পুরানো প্যাটার্ন। এখানে link1পুরানো প্যাটার্নটি প্রতিস্থাপন করা হবে
  3. নতুন প্যাটার্ন। এখানে link2নতুন প্যাটার্নটি যা link1প্রতিস্থাপন করা হবে

স্ক্রিপ্টটি পুনরাবৃত্তভাবে ডিরেক্টরি ব্যবহার করে ডিরেক্টরিতে সমস্ত সিমলিংকগুলি পড়তে থাকে find "$DIR" -type l এবং একে একে লাইন দিয়ে প্রক্রিয়াকরণ করে।

$line সেই সিলেমিংকটি যার নামকরণ করা দরকার

CUR_LINK_PATH পুরানো পথ

NEW_LINK_PATH পুরানো লিঙ্ক পথে স্ট্রিং প্রতিস্থাপন সম্পাদন করে প্রাপ্ত হয়।

পুরানো সিমিলিংক সরানো হয়েছে এবং ব্যবহার করে নতুন সিমিলিংক তৈরি করা হয়েছে ln -s "$NEW_LINK_PATH" "$line"


0

আমি একটি কমান্ড-লাইন পিএইচপি স্ক্রিপ্ট লিখে শেষ করেছি যা মনে হয় কৌশলটি করছে।

<?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";
            }
        }
    }
}
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.