কেন "rm -r" এই ফোল্ডারটি মুছতে অক্ষম?


12

আমি একটি ফোল্ডার আছে -wxঅনুমতি নামক folder1নামক এটা ভিতরে অন্য ফোল্ডারে folder2সঙ্গে rwxঅনুমতি।

আমি folder1এই আদেশটি ব্যবহার করে মুছে ফেলার চেষ্টা করেছি :

rm -r folder1

তবে আমি নিম্নলিখিত ত্রুটি পেয়েছি:

rm: cannot remove 'folder1': Permission denied

আমার মনে হয় যে আমি এই ত্রুটিটি পেয়েছি তার কারণ হ'ল rmপ্রোগ্রামটি প্রথমে সেই সামগ্রীটি মুছতে সক্ষম হওয়ার জন্য folder1(তার মধ্যে থাকা ফাইল এবং ফোল্ডারের নামগুলি folder1পাওয়া) দরকার (কারণ আপনি কোনও ফাইল মুছতে পারবেন না) বা ফোল্ডারটির নাম না জেনে আমি মনে করি), এবং তারপরে rmপ্রোগ্রামটি folder1নিজেই মুছতে পারে।

কিন্তু যেহেতু folder1নেই readঅনুমতি, তারপর rmপ্রোগ্রাম না এর বিষয়বস্তু পেতে পারেন, তাই এটা তার সামগ্রী মুছে নাও করতে পারে এবং যেহেতু এটি এর বিষয়বস্তু মুছে ফেলতে পারবেন না, তবে এটা মুছতে পারবেন না।

আমি কি সঠিক?


1
"Ls -l" করুন এবং ডাইরেক্টোরির অনুমতিগুলি কী তা আমাদের বলুন।
jamesqf

উত্তর:


19

আপনার বিশ্লেষণটি সঠিক বলে আমি মনে করি: ডিরেক্টরিটি খালি নয় বলে আপনি ডিরেক্টরিটি মুছতে পারবেন না এবং আপনি এটি খালি করতে পারবেন না কারণ আপনি এর সামগ্রীগুলি দেখতে পাচ্ছেন না।

আমি কেবল একবার চেষ্টা করে দেখেছি:

$ mkdir -p folder1/folder2
$ chmod -r folder1
$ rm -rf folder1
rm: cannot remove 'folder1': Permission denied
$ rmdir folder1/folder2
$ rm -rf folder1
$ 

আমি যখন "আপনি" লিখেছিলাম তখন আমি বোঝাতে চাইছি আপনি যে কোনও প্রোগ্রাম চালাতে পারেন। আপনার rm -rকমান্ডটি প্রথমে folder1এটি একটি ডিরেক্টরি দেখায় তাই এটি খালি করার জন্য এটির বিষয়বস্তুগুলি আবিষ্কার করার চেষ্টা করে, তবে পড়ার অনুমতি অনুপস্থিতিতে ব্যর্থ হয়, তবে এটি মুছে ফেলার চেষ্টা করে তবে ব্যর্থ হয় কারণ এটি খালি নয়। "অনুমতি অস্বীকার" বিভ্রান্তিকর; আমি মনে করি "ডিরেক্টরি খালি নয়" ( rmdirপ্রতিবেদনের মতো ) আরও উপযুক্ত হবে)


4
এটি Directory not emptyএই ক্ষেত্রে রিপোর্ট করতে পারে না যেহেতু এটি এটি খালি কিনা তা জানতে পারে না। আপনি যে খালি ডিরেক্টরিটি পড়েন না সেগুলি মুছে ফেলার চেষ্টা করার পরে আপনি একই ত্রুটিটি পেতে পারেন। (এছাড়াও, দয়া করে আমার আগের মন্তব্যটি উপেক্ষা করুন, আমার আমার চিন্তাভাবনা ক্যাপ লাগেনি)।
কুসালানন্দ

1
@ কুসালানন্দ এটিকে বুদ্ধিমান মনে হলেও rmdir"ডিরেক্টরি খালি নয়" বলে রিপোর্ট করতে সক্ষম। এবং আপনি যদি আমার পরীক্ষাটি পড়েন তবে আপনি দেখতে পাবে যে এটি একবার খালি করে দেওয়ার পরে কোনওfolder1 ডিরেক্টরি পড়ার অনুমতি ছাড়াই ডিরেক্টরিটি সরিয়ে নিতে এটি গ্রহণ করে accep
ব্যবহারকারী2233709

2
আপনার পরীক্ষাটি আমাদের সিস্টেমগুলির মধ্যে একটি আকর্ষণীয় পার্থক্য দেখায়। খালি Permission deniedকরার চেষ্টা করার rm -r folder1সময় আমি একটি পাই । আমি লিনাক্স নয়, ওপেনবিএসডি-তে আছি।
কুসালানন্দ

@ কুসালানন্দ এটি আকর্ষণীয়। আমি ভাবতাম যে এই আচরণটি একক ইউনিক্স স্পেসিফিকেশন দ্বারা নির্দিষ্ট করা হয়েছে, যাতে লিনাক্স এবং {ফ্রি, নেট, ওপেন} বিএসডি একই রকম আচরণ করবে। (রেকর্ডের জন্য, আমি একটি লিনাক্স 4.9.144-3 x86_64 কার্নেল দিয়ে দেবিয়ান স্ট্রেচ 9.8 ব্যবহার করছি))
ব্যবহারকার 23237070

হুম ... শুধু POSIX বলছেন যে যদি প্রতীক একটি ডিরেক্টরি হয় এবং -rব্যবহার করা হয়, প্রতিটি ডিরেক্টরির এন্ট্রি (ছাড়া .এবং ..) সরানো উচিত যেন তারা একটি ফাইল প্রতীক ছিল rm -r। এটি প্রদর্শিত হবে যেন এটি জিডিইউ ডিরেক্টরিতে পাঠযোগ্য না হলে rmকেবল একটি কাজ rmdir()করে কারণ এটি এর সামগ্রীগুলি পাওয়ার কোনও উপায় থাকবে না।
কুসালানন্দ

7

মুছে ফেলার জন্য সিস্টেমটি অবশ্যই সামগ্রীগুলি পড়তে সক্ষম হবে এবং কী মুছতে হবে তা সনাক্ত করতে সক্ষম হতে হবে।

আপনি যা চেষ্টা করছেন তা অনুকরণ করার চেষ্টা করেছি:

[vagrant@desktop1 ~]$ sudo rm -rf folder1/ && mkdir -pv folder1/folder2 && sudo chmod 333 -v folder1/ && sudo chmod 777 -v folder1/folder2
mkdir: created directory 'folder1'
mkdir: created directory 'folder1/folder2'
mode of 'folder1/' changed from 0775 (rwxrwxr-x) to 0333 (-wx-wx-wx)
mode of 'folder1/folder2' changed from 0775 (rwxrwxr-x) to 0777 (rwxrwxrwx)
[vagrant@desktop1 ~]$ ls -lh
total 0
d-wx-wx-wx. 3 vagrant vagrant 21 Feb 24 10:40 folder1
[vagrant@desktop1 ~]$ 

যদি আমরা পড়ার অনুমতি ছাড়াই মোছার চেষ্টা করি তবে এটি ব্যর্থ হয়:

[vagrant@desktop1 ~]$ rm -r folder1/
rm: cannot remove 'folder1/': Permission denied
[vagrant@desktop1 ~]$ sudo chmod +r folder1/
[vagrant@desktop1 ~]$ rm -r folder1/
[vagrant@desktop1 ~]$ 

দুটি প্রচেষ্টা একটি স্ট্রেসের মধ্যে পার্থক্য হ'ল ডিরেক্টরি বিষয়বস্তু পড়তে পারে না (getdents):

newfstatat(AT_FDCWD, "folder1/", {st_mode=S_IFDIR|0333, st_size=21, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "folder1/", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = -1 EACCES (Permission denied)
geteuid()                               = 1000
newfstatat(AT_FDCWD, "folder1/", {st_mode=S_IFDIR|0333, st_size=21, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "folder1/", W_OK)   = 0
openat(AT_FDCWD, "folder1/", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = -1 EACCES (Permission denied)
newfstatat(AT_FDCWD, "folder1/", {st_mode=S_IFDIR|0333, st_size=21, ...}, AT_SYMLINK_NOFOLLOW) = 0

পড়ার অনুমতি সহ:

newfstatat(AT_FDCWD, "folder1/", {st_mode=S_IFDIR|0777, st_size=21, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "folder1/", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fstat(3, {st_mode=S_IFDIR|0777, st_size=21, ...}) = 0
fcntl(3, F_GETFL)                       = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW)
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
getdents(3, /* 3 entries */, 32768)     = 80
close(3)                                = 0
geteuid()                               = 1000

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


0

ঠিক আছে, ttaran7 দ্বারা উত্তর সম্পর্কে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই, সুতরাং এটি একটি উত্তর বলে মনে হবে এটি হতে হবে। কম খ্যাতির কারণে আমার আপ-ভোট সর্বজনীনভাবে দৃশ্যমান নয়। আমি উত্তরটি স্রেফ অনুমানের পরিবর্তে একটি সিস্টেম কল ট্রেস সহ প্রকৃত পক্ষে ভোট দিয়েছি।

ওপি-র প্রশ্নের উত্তর দিতে: হ্যাঁ, আপনার যুক্তিটি সঠিক ছিল: ডিরেক্টরিটি পড়তে না পারার কারণে আপনি অবরুদ্ধ হয়ে পড়েছেন

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

newfstatat(AT_FDCWD, "folder1", {st_mode=S_IFDIR|0311, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "folder1", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_DIRECTORY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "folder1", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_CLOEXEC|O_DIRECTORY) = -1 EACCES (Permission denied)
unlinkat(AT_FDCWD, "folder1", AT_REMOVEDIR) = -1 ENOTEMPTY (Directory not empty)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2995
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_AU/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_AU/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=45256, ...}) = 0
mmap(NULL, 45256, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8db25ca000
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale- langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=578, ...}) = 0
mmap(NULL, 578, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8db25c9000
close(3)                                = 0
write(2, "rm: ", 4rm: )                     = 4
write(2, "cannot remove 'folder1'", 23cannot remove 'folder1') = 23
openat(AT_FDCWD, "/usr/share/locale/en_AU/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_AU/LC_MESSAGES/libc.mo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2893, ...}) = 0
mmap(NULL, 2893, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8db25c8000
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, ": Permission denied", 19: Permission denied)     = 19
write(2, "\n", 1
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exitgroup(1)

চতুর্থ লাইনের দিকে দেখুন: unlinkat... ডিরেক্টরিটি খালি না হওয়ায় এটি ব্যর্থ হয়। এখন এটাই আমি অপ্রত্যাশিত আচরণ বিবেচনা করব, সত্য যে এটি পড়ার অনুমতি না থাকা সত্ত্বেও ডিরেক্টরিটি মুছে ফেলার চেষ্টা করে।


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