ফাইলগুলির সাথে প্রতীকী লিঙ্কগুলি প্রতিস্থাপন করুন


31

তারা যে লিঙ্কে লিঙ্ক করেছেন তার সাথে সমস্ত প্রতীকী লিঙ্কগুলি প্রতিস্থাপন করার সহজ উপায় আছে?


3
আপনি কোন সমস্যার সমাধান করার চেষ্টা করছেন?
ড্যানিয়েল বেক

3
আমার কাছে অন্য ড্রাইভে প্রতীকী লিঙ্ক রয়েছে unch আমার সেই ড্রাইভের সমস্ত ফাইল সরানো দরকার যা রেফারেন্সযুক্ত অন্য কোথাও যাতে আমি এটিকে সরাতে পারি।
মার্টি ট্রেনউথ

উত্তর:


14

"সহজ" এর কয়েকটি সংজ্ঞার জন্য:

#!/bin/sh
set -e
for link; do
    test -h "$link" || continue

    dir=$(dirname "$link")
    reltarget=$(readlink "$link")
    case $reltarget in
        /*) abstarget=$reltarget;;
        *)  abstarget=$dir/$reltarget;;
    esac

    rm -fv "$link"
    cp -afv "$abstarget" "$link" || {
        # on failure, restore the symlink
        rm -rfv "$link"
        ln -sfv "$reltarget" "$link"
    }
done

যুক্তি হিসাবে লিঙ্কের নাম সহ এই স্ক্রিপ্টটি চালান, উদাহরণস্বরূপ find . -type l -exec /path/tos/script {} +


2
সম্পাদনা করার জন্য ধন্যবাদ, আনন, তবে স্ক্রিপ্টটি প্রয়োজনীয় জায়গাগুলিতে ভেরিয়েবল উদ্ধৃত করে ফাঁকা জায়গা সহ ফাইলের নামগুলি হ্যান্ডেল করে । Sh / bash এ একটি নূতন পরিবর্তন "$var"করা "${var}"। আমি একটি বাশিজম ( [[) সরিয়েছি , বাকিটি পসিক্স শের সাথে সামঞ্জস্যপূর্ণ।
মাধ্যাকর্ষণ

সিমলিংক ব্যর্থতা পরিচালনা করার জন্য আরও শক্তিশালী পদ্ধতি cpএকই ডিরেক্টরিতে একটি অস্থায়ী ফাইলের পরে mv -fসেই অস্থায়ী ফাইলটিকে আসল রূপে দেওয়া। মানুষের চেপে ধরে মত সমস্যার তাড়ান উচিত Ctrl-Cবা ফাইলসিস্টেম মধ্যে পূরণ rmএবং cpকমান্ড (এইভাবে তাই নয়, নতুন বাধা lnকাজ করা থেকে)। অস্থায়ী ফাইলের নামগুলি ls -aপরে প্রয়োজনে পরিষ্কারের জন্য স্পট করা সহজ ।
মিঃ ফুজ

পার্শ্ব নোট হিসাবে, আমি কেন গুরুত্ব সহকারে মনে করতে পারি না আমি কেবল মামলা ব্লকের abstarget=$(readlink -f "$link")পরিবর্তে কেন ব্যবহার করিনি , তবে এটি বহনযোগ্যতার কারণ হতে পারে।
মাধ্যাকর্ষণ

17

একটি নতুন ডিরেক্টরিতে ডেটা অনুলিপি করতে কেবল টার ব্যবহার করা আরও সহজ হতে পারে।

-H      (c and r mode only) Symbolic links named on the command line will
        be followed; the target of the link will be archived, not the
        link itself.

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

tar -hcf - sourcedir | tar -xf - -C newdir

tar --help:
-H, --format=FORMAT        create archive of the given format
-h, --dereference          follow symlinks; archive and dump the files they point to

1
আমি আপনার সমাধানটি পছন্দ করি তবে আমি আপনার বার্তার শেষ অংশটি বুঝতে পারি না। আমার জন্য আপনার করা উচিত:tar -hcf - sourcedir | tar -xf - -C newdir
সেব ডিএ রোচা

1
সম্মত, এই উত্তর মন্তব্য অনুসারে আপডেট করা প্রয়োজন।
আস্তাবদা

1
cp -Lসহজ সমাধান
plesiv

@ প্লিজিভ সত্য, এবং পিক্সিক-কমপ্লায়েন্ট, তবে সমস্ত cpবাস্তবায়নই ডিরেক্টরিগুলি অনুলিপি করবে না ।
Wyatt8740

16

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি -Lতবে cpকমান্ডের পতাকাটি আপনার যা করা উচিত ঠিক তা করা উচিত।

কেবলমাত্র সমস্ত সিমলিংক অনুলিপি করুন এবং এটি তাদের নির্দেশিত ফাইলগুলির সাথে প্রতিস্থাপন করবে।


4
ধন্যবাদ - প্রায় আমি যা দরকার:: আমি ভালো কিছু কি ছিল cp -L files tmp/ && rm files && cp tmp/files . আপনি নির্মল, তাহলে হয়ত আরও অনেক বেশি মানুষের সাহায্য করব ...
ঋষি

5

"সহজ" আপনার একটি কাজ হবে, সম্ভবত।

আমি সম্ভবত একটি স্ক্রিপ্ট লিখেছি যা প্রতীকীভাবে লিঙ্কযুক্ত ফাইলগুলি সন্ধান করতে "ফাইন্ড" কমান্ড লাইন ইউটিলিটি ব্যবহার করে, তারপর ফাইলটি সরিয়ে এবং প্রতিস্থাপনের জন্য আরএম এবং সিপি কল করে। আপনি সম্ভবত সিম লিঙ্কটি স্থানান্তরিত করার আগে পর্যাপ্ত ফাঁকা জায়গা বাকি আছে কিনা তা পরীক্ষা করে ডাকা অ্যাকশনটিও ভালভাবে করতে চান।

আরেকটি সমাধান হতে পারে যে কোনও সমস্যা যা সাইম লিঙ্কগুলি (সাম্বার মতো) লুকিয়ে রাখে এমন কোনও সমস্যার মধ্যে দিয়ে ফাইল সিস্টেমকে মাউন্ট করা, তারপরে কেবল তার থেকে সমস্ত কিছু অনুলিপি করুন। তবে অনেক ক্ষেত্রে এরকম কিছু অন্যান্য সমস্যাগুলির পরিচয় দেয়।

আপনার প্রশ্নের আরও সরাসরি উত্তর সম্ভবত "হ্যাঁ"।

সম্পাদনা: আরও নির্দিষ্ট তথ্যের জন্য অনুরোধ অনুসারে। সন্ধানের ম্যান পেজ অনুসারে , এই কমান্ডটি সমস্ত সিম লিঙ্ক ফাইলগুলিকে / ডিরেক্টরি থেকে 2 ডিরেক্টরিগুলির গভীরতায় তালিকাবদ্ধ করবে

find / -maxdepth 2 -type l -print

( এটি এখানে পাওয়া গেছে )

এটির সন্ধানের জন্য কোনও কিছু কার্যকর করার জন্য অনুসন্ধান পেতে:

find / -maxdepth 2 -type l -exec ./ReplaceSymLink.sh {} \;

আমি বিশ্বাস করি যে আমি সবে তৈরি কিছু স্ক্রিপ্ট কল করব এবং আপনার সন্ধান করা ফাইলটির নামটি দিয়ে দিন। বিকল্পভাবে, আপনি ফাইলটি খুঁজে পেতে আউটপুট ক্যাপচার করতে পারেন ("Find [blah]> symlinks.data" ইত্যাদি ব্যবহার করুন) তারপরে সেই ফাইলটি কোনও স্ক্রিপ্টে পাস করুন যাতে আপনি কৃত্রিমভাবে অনুলিপিটি অনুলিপি করার জন্য লিখেছেন।


? কিছুটা জেনেরিক - আপনি কি বিস্তারিত বলতে পারবেন?
Linker3000

2
বাক্য -exec ./ReplaceSymLink.sh {} \;
গঠনটি

এটি আইটেমগুলি সন্ধান করতে চলেছে এবং উত্তর হিসাবে চিহ্নিত করা লিঙ্কগুলি প্রতিস্থাপন করতে ব্যবহৃত হয়!
মার্টি ট্রেনউথ

3

এটি হ'ল অনিয়েনার আমি ব্যবহার করেছি: ধরে নিন যে সমস্ত স্থানীয় ফাইলগুলি "উত্স" এর অন্য কোনও ফাইলের লিঙ্ক। আপনি নিদর্শন বা "সন্ধান" দিয়ে ফাইল নির্বাচন পরিমার্জন করতে পারেন। দয়া করে, ব্যবহার করার আগে বুঝতে।

জন্য f ইন *; do cp - মুছে ফেলা গন্তব্য উত্স / $ f $ f; সম্পন্ন

আশাকরি এটা সাহায্য করবে


রিডলিঙ্ক ব্যবহার সম্পর্কে কীভাবে: এফ ইন * এর জন্য; do সিপি ---- অপসারণ-গন্তব্য "$ (পঠন লিঙ্ক destination চ)" "$ চ"; সম্পন্ন
দিয়েগো

হ্যাঁ, এটি একটি ভাল ধারণা, তবে আপনি অপারেশনের উপর কিছুটা নিয়ন্ত্রণ হারিয়ে ফেলেন। আমার সমাধানের একটি সীমা হ'ল এটি মাঝখানে ফাঁকা ফাইলগুলির জন্য বা খুব দীর্ঘ তালিকার জন্য কাজ করে না। সম্ভবত চূড়ান্ত সমাধানটি 'গন্তব্য অপসারণ' এর সাথে উপরের 'ফাইন্ড - এক্সেক' একসাথে রাখা। কেউ চেষ্টা করতে চান?
মাস্ট্রোজেপেট্টো

মাঝের ফাঁকা অংশগুলি ডাবলকোটগুলিতে "$ f" লাগিয়ে প্রশমিত করতে হবে। এখানে আমি এটি "ফুপ লুপ" এর পরিবর্তে "সন্ধান করুন এবং xargs" দিয়ে কীভাবে ব্যবহার করব: সন্ধান করুন / } ")" {} "'আমি দৃশ্যমানতার জন্য পৃথক উত্তর হিসাবে পোস্ট করেছি। superuser.com/a/1329543/499386
দিয়েগো

2
find . -type l -exec cp --dereference --recursive '{}' '{}'.dereferenced \;

প্রতিটি প্রতিলিঙ্কযুক্ত ফাইল / ফোল্ডারের একটি অনুলিপি তৈরি করবে <filename>.dereferenced, যা কেবল তাদের সরাসরি প্রতিস্থাপনের চেয়ে নিরাপদ (যদি কম সুবিধাজনক হয়)। সিমলিংকের ফাইলনামে অনুলিপি করা তথ্য পাঠকের পক্ষে অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।


2

পূর্ববর্তী কয়েকটি ধারণাগুলি ব্যবহার করে, নিম্নলিখিত কমান্ডটি প্রতিটি সিমলিংকে মূল অনুলিপি সহ পুনরাবৃত্তি করবে:

find . -type l -exec bash -c "echo 'Replacing {} ...';  cp -LR '{}' '{}'.dereferenced;  rm '{}';  mv '{}'.dereferenced '{}'" \;


1

লোটের ভাল উত্তর আছে তবে আমি যেহেতু আপনি সহজ কিছু খুঁজছিলেন

for i in *; do link=$(readlink $i) && rm $i && mv $link $i; done

সামান্য বর্ধন প্রতীকী লিঙ্কগুলি সন্ধান করতে সহায়তা করবে: n সন্ধানে lnk এর জন্য। টাইপ l`; do src = $ (পঠন লিঙ্ক $ lnk) && rm $ lnk && mv $ src $ lnk; সম্পন্ন (যদিও শ্রেণিবিন্যাসের সাথে পরীক্ষা করা হয়নি, ব্যাকটিক্সগুলি সম্পর্কে সতর্কতা অবলম্বন করুন)
রোমান সুসি

1

জিনউইউভিউ কপির লিঙ্কগুলি অনুলিপি করার ক্ষেত্রে আমার একই সমস্যা ছিল যখন আপনি সাধারণত লিংকটি অনুসরণ এবং ফাইলটি অনুলিপি করার আশা করেন।

আমি সমস্ত লিঙ্ক অনুসরণ করে এবং ডিরেক্টরিটিতে সমস্ত পয়েন্ট-টু ফাইলগুলি অনুলিপি করে ডিরেক্টরিটি পরিষ্কার করার জন্য যা করেছি তা ছিল একটি স্ক্র্যাচ ডিরেক্টরি তৈরি করা, যেমন রান করুন

"for file in `ls`; do cp -L $file scratchdir/$file; done; mv scratchdir/* ./" 

কোনও স্ক্রিপ্টে রাখা খুব বিপজ্জনক কারণ এখানে কোনও চেকিং নেই তবে এটি আমার সমস্যাটিকে স্থির করে।



0

আমি একটি লাইন সংস্করণ করেছি, যেহেতু আমার ওয়েব-হোটেল বাশ-স্ক্রিপ্টগুলিকে অনুমতি দেয় নি এবং এটি আমার পক্ষে ভাল কাজ করেছে:

before:
> find . -type l | wc -l
358

> for link in `find . -type l` ; do echo "$link : "; ls -al $link ; cp $link notalink; unlink $link; mv notalink $link ; ls -al $link; done
...

after:
> find . -type l | wc -l
0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.