তারা যে লিঙ্কে লিঙ্ক করেছেন তার সাথে সমস্ত প্রতীকী লিঙ্কগুলি প্রতিস্থাপন করার সহজ উপায় আছে?
তারা যে লিঙ্কে লিঙ্ক করেছেন তার সাথে সমস্ত প্রতীকী লিঙ্কগুলি প্রতিস্থাপন করার সহজ উপায় আছে?
উত্তর:
"সহজ" এর কয়েকটি সংজ্ঞার জন্য:
#!/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 {} +
"$var"
করা "${var}"
। আমি একটি বাশিজম ( [[
) সরিয়েছি , বাকিটি পসিক্স শের সাথে সামঞ্জস্যপূর্ণ।
cp
একই ডিরেক্টরিতে একটি অস্থায়ী ফাইলের পরে mv -f
সেই অস্থায়ী ফাইলটিকে আসল রূপে দেওয়া। মানুষের চেপে ধরে মত সমস্যার তাড়ান উচিত Ctrl-C
বা ফাইলসিস্টেম মধ্যে পূরণ rm
এবং cp
কমান্ড (এইভাবে তাই নয়, নতুন বাধা ln
কাজ করা থেকে)। অস্থায়ী ফাইলের নামগুলি ls -a
পরে প্রয়োজনে পরিষ্কারের জন্য স্পট করা সহজ ।
abstarget=$(readlink -f "$link")
পরিবর্তে কেন ব্যবহার করিনি , তবে এটি বহনযোগ্যতার কারণ হতে পারে।
একটি নতুন ডিরেক্টরিতে ডেটা অনুলিপি করতে কেবল টার ব্যবহার করা আরও সহজ হতে পারে।
-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
tar -hcf - sourcedir | tar -xf - -C newdir
cp -L
সহজ সমাধান
cp
বাস্তবায়নই ডিরেক্টরিগুলি অনুলিপি করবে না ।
যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি -L
তবে cp
কমান্ডের পতাকাটি আপনার যা করা উচিত ঠিক তা করা উচিত।
কেবলমাত্র সমস্ত সিমলিংক অনুলিপি করুন এবং এটি তাদের নির্দেশিত ফাইলগুলির সাথে প্রতিস্থাপন করবে।
cp -L files tmp/ && rm files && cp tmp/files .
আপনি নির্মল, তাহলে হয়ত আরও অনেক বেশি মানুষের সাহায্য করব ...
"সহজ" আপনার একটি কাজ হবে, সম্ভবত।
আমি সম্ভবত একটি স্ক্রিপ্ট লিখেছি যা প্রতীকীভাবে লিঙ্কযুক্ত ফাইলগুলি সন্ধান করতে "ফাইন্ড" কমান্ড লাইন ইউটিলিটি ব্যবহার করে, তারপর ফাইলটি সরিয়ে এবং প্রতিস্থাপনের জন্য আরএম এবং সিপি কল করে। আপনি সম্ভবত সিম লিঙ্কটি স্থানান্তরিত করার আগে পর্যাপ্ত ফাঁকা জায়গা বাকি আছে কিনা তা পরীক্ষা করে ডাকা অ্যাকশনটিও ভালভাবে করতে চান।
আরেকটি সমাধান হতে পারে যে কোনও সমস্যা যা সাইম লিঙ্কগুলি (সাম্বার মতো) লুকিয়ে রাখে এমন কোনও সমস্যার মধ্যে দিয়ে ফাইল সিস্টেমকে মাউন্ট করা, তারপরে কেবল তার থেকে সমস্ত কিছু অনুলিপি করুন। তবে অনেক ক্ষেত্রে এরকম কিছু অন্যান্য সমস্যাগুলির পরিচয় দেয়।
আপনার প্রশ্নের আরও সরাসরি উত্তর সম্ভবত "হ্যাঁ"।
সম্পাদনা: আরও নির্দিষ্ট তথ্যের জন্য অনুরোধ অনুসারে। সন্ধানের ম্যান পেজ অনুসারে , এই কমান্ডটি সমস্ত সিম লিঙ্ক ফাইলগুলিকে / ডিরেক্টরি থেকে 2 ডিরেক্টরিগুলির গভীরতায় তালিকাবদ্ধ করবে
find / -maxdepth 2 -type l -print
এটির সন্ধানের জন্য কোনও কিছু কার্যকর করার জন্য অনুসন্ধান পেতে:
find / -maxdepth 2 -type l -exec ./ReplaceSymLink.sh {} \;
আমি বিশ্বাস করি যে আমি সবে তৈরি কিছু স্ক্রিপ্ট কল করব এবং আপনার সন্ধান করা ফাইলটির নামটি দিয়ে দিন। বিকল্পভাবে, আপনি ফাইলটি খুঁজে পেতে আউটপুট ক্যাপচার করতে পারেন ("Find [blah]> symlinks.data" ইত্যাদি ব্যবহার করুন) তারপরে সেই ফাইলটি কোনও স্ক্রিপ্টে পাস করুন যাতে আপনি কৃত্রিমভাবে অনুলিপিটি অনুলিপি করার জন্য লিখেছেন।
-exec ./ReplaceSymLink.sh {} \;
এটি হ'ল অনিয়েনার আমি ব্যবহার করেছি: ধরে নিন যে সমস্ত স্থানীয় ফাইলগুলি "উত্স" এর অন্য কোনও ফাইলের লিঙ্ক। আপনি নিদর্শন বা "সন্ধান" দিয়ে ফাইল নির্বাচন পরিমার্জন করতে পারেন। দয়া করে, ব্যবহার করার আগে বুঝতে।
জন্য f ইন *; do cp - মুছে ফেলা গন্তব্য উত্স / $ f $ f; সম্পন্ন
আশাকরি এটা সাহায্য করবে
find . -type l -exec cp --dereference --recursive '{}' '{}'.dereferenced \;
প্রতিটি প্রতিলিঙ্কযুক্ত ফাইল / ফোল্ডারের একটি অনুলিপি তৈরি করবে <filename>.dereferenced
, যা কেবল তাদের সরাসরি প্রতিস্থাপনের চেয়ে নিরাপদ (যদি কম সুবিধাজনক হয়)। সিমলিংকের ফাইলনামে অনুলিপি করা তথ্য পাঠকের পক্ষে অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।
find ./ -type l -print0|xargs -0 -n1 -i sh -c 'cp --remove-destination $(readlink "{}") "{}" '
মাস্ত্রোজেপেটোর https://superuser.com/a/1301199/499386 এর উপর ভিত্তি করে
লোটের ভাল উত্তর আছে তবে আমি যেহেতু আপনি সহজ কিছু খুঁজছিলেন
for i in *; do link=$(readlink $i) && rm $i && mv $link $i; done
জিনউইউভিউ কপির লিঙ্কগুলি অনুলিপি করার ক্ষেত্রে আমার একই সমস্যা ছিল যখন আপনি সাধারণত লিংকটি অনুসরণ এবং ফাইলটি অনুলিপি করার আশা করেন।
আমি সমস্ত লিঙ্ক অনুসরণ করে এবং ডিরেক্টরিটিতে সমস্ত পয়েন্ট-টু ফাইলগুলি অনুলিপি করে ডিরেক্টরিটি পরিষ্কার করার জন্য যা করেছি তা ছিল একটি স্ক্র্যাচ ডিরেক্টরি তৈরি করা, যেমন রান করুন
"for file in `ls`; do cp -L $file scratchdir/$file; done; mv scratchdir/* ./"
কোনও স্ক্রিপ্টে রাখা খুব বিপজ্জনক কারণ এখানে কোনও চেকিং নেই তবে এটি আমার সমস্যাটিকে স্থির করে।
for f in *; do cp --remove-destination $(readlink "$f") "$f"; done
আমি একটি লাইন সংস্করণ করেছি, যেহেতু আমার ওয়েব-হোটেল বাশ-স্ক্রিপ্টগুলিকে অনুমতি দেয় নি এবং এটি আমার পক্ষে ভাল কাজ করেছে:
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