আমি কীভাবে সিডলিঙ্কগুলি ধ্বংস করা থেকে সেড -i প্রতিরোধ করব?


21

sed -iসিমলিংকে মৃত্যুদন্ড কার্যকর করা হ'ল কেন সেই লিঙ্কটি নষ্ট করে এবং এটিকে গন্তব্য ফাইলের সাথে প্রতিস্থাপন করে? কীভাবে এড়ানো যায়?

যেমন।

$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:46 pet
lrwxrwxrwx 1 madneon madneon 6 mar 23 16:48 pet_link -> pet

$ sed -i 's/cat/dog/' pet_link

$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:48 pet
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:49 pet_link

এবং কেন এটি বাগ হিসাবে বিবেচনা করা হয় না?

উত্তর:


25

-i/ --in-placeপতাকা জায়গায় একটি ফাইল সম্পাদনা। ডিফল্টরূপে, sedপ্রদত্ত ফাইলটি পড়ে, এটি অস্থায়ী ফাইলে আউটপুট করে প্রক্রিয়া করে, তারপরে মূলটি একটি সিমলিংক কিনা তা পরীক্ষা না করে অস্থায়ী ফাইলটি অনুলিপি করে।

জিএনইউতে sedএকটি --follow-symlinksপতাকা রয়েছে যা এটি আপনার পছন্দ মতো আচরণ করে:

$ echo "cat" > pet
$ ln --symbolic pet pet_link
$ sed --in-place --follow-symlinks 's/cat/dog/' pet_link
$ cat pet
dog

6
এটি জায়গায় কোনও ফাইল সম্পাদনা করে না, তবে বর্তমান ডিরেক্টরিতে ফাইলটির একটি টেম্প অনুলিপি সম্পাদনা করে তারপরে সেই অস্থায়ী অনুলিপিটি মূলটির উপরে স্থানান্তরিত করে।
মাইকজার্ভ

@ মাইকজারভ আমি প্রয়োগের বিশদটি এড়িয়ে গেছি কারণ প্রশ্নটি ছিল ইন্টারফেসটি নিয়ে। যদিও জানা ভাল, ধন্যবাদ!
আনকো

1

এটি একটি বাগ নয়, এই নকশা দ্বারা যেহেতু sedএকটি হল এস tream ইডি itor, না একটি ফাইল এডিটর। এটি মূলত একটি অনুলিপি তৈরি করে এবং অনুলিপি সহ মূল ফাইলটি প্রতিস্থাপন করে। BashFAQ

বিকল্পভাবে আপনি exপরিবর্তে কমান্ড ব্যবহার করতে পারেন যার বিকল্পের জন্য একই ধরনের বাক্য গঠন রয়েছে, যেমন

ex +%s/cat/dog/ge -scwq pet_link

বা একাধিক ফাইল:

ex "+bufdo! %s/cat/dog/ge" -scxa **/pet_link*

এটি প্রতীকী লিঙ্কগুলি ধ্বংস করবে না।

সম্পর্কিত: আমি কীভাবে হার্ডডিংস ধ্বংস করা থেকে বিরত রাখতে পারি?


0

আমি দেখতে পাচ্ছি যে এটিও ভালভাবে কাজ করে (প্রতীকী এবং কঠোর লিঙ্ক উভয়ই সংরক্ষণ করে):

sed 's/cat/dog/' pet_link > pet_link.tmp
cat pet_link.tmp > pet_link
rm pet_link.tmp

0

একটি সমাধান রয়েছে যা আমরা কখনও কখনও একই ফাইল থেকে পড়তে পড়তে ব্যবহার করি। ম্যান পৃষ্ঠাটির একটি অংশ এখানে দেওয়া হয়েছে:

   sponge reads standard input and writes it out to the specified file.
   Unlike a shell redirect, sponge soaks up all its input before opening
   the output file. This allows constructing pipelines that read from and
   write to the same file.

   It also creates the output file atomically by renaming a temp file into
   place, and preserves the permissions of the output file if it already
   exists. If the output file is a special file or symlink, the data will
   be written to it.

এখানে একটি স্নিপেট রয়েছে যা দেখায় যে এটি প্রতীকী লিঙ্কগুলি সংরক্ষণ করতে পারে, যদিও আমি সাধারণত ইনোডগুলি সংরক্ষণের জন্য এটি ব্যবহার করি:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

rm -f pet pet_link
echo "cat" > pet
pl " Input data file $FILE:"
head -v pet

pl " Results, before sed:"
ln --symbolic pet pet_link
ls -ligG pet pet_link
# sed --in-place --follow-symlinks 's/cat/dog/' pet_link
pe
pe " Results, after sed:"
sed 's/cat/dog/' pet_link | sponge pet_link
head -v pet
ls -ligG pet pet_link

যা উত্পাদন করে:

-----
 Input data file data1:
==> pet <==
cat

-----
 Results, before sed:
1571283 -rw-r--r-- 1 4 Nov 26 23:03 pet
1571286 lrwxrwxrwx 1 3 Nov 26 23:03 pet_link -> pet

 Results, after sed:
==> pet <==
cat
1571283 -rw-r--r-- 1 4 Nov 26 23:03 pet
1571286 lrwxrwxrwx 1 3 Nov 26 23:03 pet_link -> pet

যেমন একটি সিস্টেমে:

OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.9 (jessie) 
bash GNU bash 4.3.30

স্পঞ্জ কোডটি প্যাকেজ মুরতুলগুলিতে পাওয়া যায় - কিছু বিবরণ:

sponge  soak up standard input and write to a file (man)
Path    : /usr/bin/sponge
Package : moreutils
Home    : http://kitenet.net/~joey/code/moreutils/
Version : 0.52
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)

আমাদের দোকানে, আমরা একটি সংস্করণ লিখেছিলাম যা খুব বড় ফাইলগুলির ক্ষেত্রে একটি অস্থায়ী ফাইলে লিখেছে।

প্যাকেজটি দেবিয়ান, ফেডোরা, ম্যাকোস (ব্রিউয়ের মাধ্যমে) ইত্যাদি উপলভ্য রয়েছে ... চিয়ার্স,

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