'আরএম' এবং 'লিঙ্কমুক্ত' এর মধ্যে পার্থক্য কী?


55

অনুমান করে আপনি জানেন যে লক্ষ্যটি একটি প্রতীকী লিঙ্ক এবং একটি ফাইল নয়, লিঙ্কটি ব্যবহার rmএবং unlinkঅপসারণের মধ্যে কোনও পার্থক্য আছে কি?


3
এই চমত্কার ServerFault উপর আচ্ছাদিত করা হয়: serverfault.com/questions/38816/...
SLM

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

আপনি এখানে @ আইকিউএন্ড্রিয়াস একটি উত্তর গ্রহণ করেছেন বলে মনে হচ্ছে না। যদি তারা আপনাকে সহায়তা করে তবে দয়া করে তা করুন।
ধূসর

উত্তর:


56

যে কোনও সময় আপনার কাছে এই ধরণের প্রশ্ন থাকলে আসলে কী ঘটছে তা দেখার জন্য একটু পরীক্ষা করা ভাল। এই জন্য আপনি ব্যবহার করতে পারেন strace

লিঙ্কমুক্ত

$ touch file1
$ strace -s 2000 -o unlink.log unlink file1

RM

$ touch file1
$ strace -s 2000 -o rm.log rm file1

আপনি যখন 2 টি ফলাফলের লগ ফাইলগুলি একবার দেখে থাকেন আপনি প্রতিটি কল আসলে কী করছে তা "দেখতে" পারবেন।

ভাঙ্গন

সঙ্গে unlinkএটা invoking এর unlink()সিস্টেম কল:

....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3)                                = 0
unlink("file1")                         = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
....

rmএটির সাথে কিছুটা আলাদা পথ:

....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid()                               = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK)      = 0
unlinkat(AT_FDCWD, "file1", 0)          = 0
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
...

সিস্টেমটি কল করে unlink()এবং unlinkat()এই ম্যান পেজে বর্ণিত পার্থক্যগুলি ব্যতীত মূলত একই: http://linux.die.net/man/2/unlinkat

উদ্ধৃতাংশ

এই লিখিত পৃষ্ঠায় বর্ণিত পার্থক্য বাদে আনলিঙ্ক () সিস্টেম কলটি লিঙ্ক (2) বা আরএমডিির (2) (পতাকাগুলিতে AT_REMOVEDIR পতাকা অন্তর্ভুক্ত কিনা তা নির্ভর করে) ঠিক একইভাবে কাজ করে।

পাথনামে প্রদত্ত পাথের নামটি যদি আপেক্ষিক হয় তবে ফাইল বর্ণনাকারী ডায়ারফডি দ্বারা উল্লিখিত ডিরেক্টরিটির সাথে এটি ব্যাখ্যা করা হয় (কলিং প্রসেসের বর্তমান কার্যকারী ডিরেক্টরিের তুলনায়, লিঙ্কবিহীন (2) এবং rmdir (2) দ্বারা করা হিসাবে ) আপেক্ষিক পথের নামের জন্য)।

যদি পাথনামে প্রদত্ত পাথের নামটি আপেক্ষিক এবং dirfd হ'ল বিশেষ মান AT_FDCWD হয়, তবে পথের নাম কলিং প্রক্রিয়াটির বর্তমান চলমান ডিরেক্টরি (যেমন আনলিংক (2) এবং rmdir (2) এর সাথে সম্পর্কিত is

পথের নাম দেওয়া পথটি যদি নিখুঁত হয় তবে dirfd এড়ানো হবে।


1
যেহেতু এটি দিচ্ছে AT_FDCWD, কার্যকরভাবে unlinkএবং এর মধ্যে কোনও পার্থক্য নেই unlinkat
বারমার

6
এটি এই উত্তরটি পড়ে আমার আনন্দিত হয় কারণ আমি কেবল শক্তিশালী, নমনীয় উপায়ে "মাছ ধরা শিখি" যখন প্রায়শই আমি একটি মাছ পাই বা কখনও কখনও আমি "মাছ ধরা শিখি" এসও :-)
ষি

20

পসিক্স উল্লেখ করে যে unlinkইউটিলিটি সি লাইব্রেরি unlinkফাংশন এবং অন্য কিছুই নয়। এটি কোনও বিকল্প নেয় না। যদি আপনি কোনও বৈধ পথের নামটি কোনও ডিরেক্টরিতে পাস করেন যা ডিরেক্টরি নয়, এবং যদি আপনার সেই ডিরেক্টরিতে লেখার অনুমতি থাকে যেখানে সেই বস্তুটি থাকে, তবে unlinkএটি সরিয়ে ফেলবে।

rmএকটি traditionalতিহ্যবাহী ইউনিক্স কমান্ড যাতে অন্যান্য কার্যকারিতা রয়েছে এবং এটি unlinkনীচে দেখুন supers

প্রথমত, rmসুরক্ষা চেকগুলি করে। যদি আপনি এমন rmকোনও বস্তুর সাথে চেষ্টা করেন যার কাছে আপনার কাছে লেখার অনুমতি নেই (যা এটি সরিয়ে দেওয়ার আপনার ক্ষমতাকে অপ্রাসঙ্গিক: সরাসরি অনুমতিগুলি হ'ল ) rmতবুও -fসুনির্দিষ্ট না করে প্রত্যাখ্যান করুন । rmফাইলটি উপস্থিত না থাকলে সাধারণত অভিযোগ করে unlink; তবে -f, rmঅভিযোগ না। এটি প্রায়শই মেকফিলস ( clean: @rm -f $(OBJS) ...) এ ব্যবহার করা make cleanহয় তাই যখন অপসারণ করার মতো কিছু থাকে না তখন ব্যর্থ হয় না।

দ্বিতীয়ত, মুছে ফেলার বিষয়টি ইন্টারেক্টিভভাবে নিশ্চিত করার বিকল্প rmরয়েছে -i

তৃতীয়ত, পুনরাবৃত্তভাবে একটি ডিরেক্টরি মুছে ফেলার জন্য rmরয়েছে -r, যা এমন কিছু যা unlinkকরার প্রয়োজন হয় না, যেহেতু সি লাইব্রেরি ফাংশন এটি করে না।

unlinkউপযোগ ঠিক ছিনতাই-ডাউন নয় rmএটা কি একটি উপসেট সঞ্চালিত rm, কিন্তু এটি শব্দার্থবিদ্যা যার সংমিশ্রণ হয়েছে rm সঙ্গে -f এবং RM ছাড়া -f

মনে করুন আপনি কেবল নিজের নিয়মিত ফাইল যা তা নির্বিশেষে একটি নিয়মিত ফাইল সরাতে চান। তদুপরি, ধরুন আপনি ফাইলটি উপস্থিত না থাকলে বা অন্য কোনও কারণে কমান্ডটি ব্যর্থ হতে চায়। আমরাও rm fileনা rm -f fileপ্রয়োজনীয়তা পূরণ করে। rm fileফাইলটি লিখনযোগ্য না হলে তা প্রত্যাখ্যান করবে। তবে rm -f fileফাইলটি অনুপস্থিত থাকলে অভিযোগ করতে অবহেলা করবে। unlink fileকাজ করে

unlinkসম্ভবত চালু ছিল কারণ rmখুব চালাক: কখনও কখনও আপনি খাঁটি ইউনিক্স unlinkশব্দার্থবিদ্যা চান: "দয়া করে ডিরেক্টরি অনুমতি অনুমতি দিলে এই ডিরেক্টরি এন্ট্রিটি সরিয়ে দিন"


2
এটি এখানে পরিষ্কার উত্তর। এটা আসলে দেয় ব্যবহারের ক্ষেত্রে জন্য unlinkশুধু বর্ণনা পার্থক্য বদলে।
ওয়াইল্ডকার্ড

19

একক ফাইলের সাথে, আরএম এবং লিঙ্কটি একই কাজটি করে, ফাইলটি সরান। যেমন পসিক্স সংজ্ঞায়িত হয়েছে, rmএবং unlinkউভয়ই কল আনলিংক করতে () সিস্টেম কল করে।

গনুহ ইন rm, এটা কল unlinkat () সিস্টেম কল, যা সমতূল্য unlink()বা কাছে rmdir () ক্ষেত্রে যেখানে পথ একটি আপেক্ষিক পাথ নির্দিষ্ট করে ছাড়া ফাংশন।

বিঃদ্রঃ

কিছু সিস্টেমে unlinkডিরেক্টরি মুছে ফেলতেও পারে। কমপক্ষে জিএনইউ সিস্টেমে unlinkকখনই কোনও ডিরেক্টরির নাম মুছতে পারে না।

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