'Rm' ve 'unlink' arasındaki fark nedir?


55

Hedefin bir dosya değil sembolik bir bağlantı olduğunu bildiğinizi varsayarak, bağlantıyı kullanmak rmve unlinkkaldırmak arasında bir fark var mı?


3
Bu oldukça iyi ServerFault üzerinde kaplıdır: serverfault.com/questions/38816/...
slm

@ slm answers Cevaplar bu soruya karşılık gelir, ancak bu soru farklıdır, “Hedefin bir dosya değil sembolik bir bağlantı olduğunu bildiğinizi varsayıyorum” diyor.
Stéphane Gourichon

@IQAndreas'ın yanıtını kabul etmiş gibisin. Lütfen size yardımcı oldularsa bunu yapın.
Gri

Yanıtlar:


56

Ne zaman bu tür sorularınız olursa, gerçekte neler olduğunu görmek için küçük bir test yapmanın en iyisidir. Bunun için kullanabilirsiniz strace.

bağlantısını kaldırmak

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

rm

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

Sonuçta ortaya çıkan 2 günlük dosyasına bir göz attığınızda, her aramanın gerçekte ne yaptığını "görebilirsiniz".

Yıkmak

İle unlinko çağırma oluyor unlink()sistem çağrısı:

....
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)                           = ?
....

Bununla rmbiraz farklı bir yol var:

....
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 +++
...

Sistem çağırır unlink()ve unlinkat()bu kılavuzda açıklanan farklılıklar dışında aslında aynıdır: http://linux.die.net/man/2/unlinkat .

alıntı

Unlinkat () sistemi çağrısı, bu kılavuz sayfasında açıklanan farklılıklar dışında, unlink (2) veya rmdir (2) ile aynı şekilde çalışır (bayrakların AT_REMOVEDIR bayrağını içerip içermediğine bağlı olarak).

Yol adında verilen yol adı göreceli ise, dosya tanıtıcısı dirfd tarafından belirtilen dizine (yorumlama işleminin geçerli çalışma dizinine göre yerine, unlink (2) ve rmdir (2) tarafından yapıldığı gibi yorumlanır. (göreceli bir yol adı için).

Yol adında verilen yol adı göreceli ve dirfd, AT_FDCWD özel değeri ise, yol adı çağrı işleminin geçerli çalışma dizinine göre yorumlanır (unlink (2) ve rmdir (2) gibi).

Eğer yol adında verilen yol adı mutlak ise, dirfd yoksayılır.


1
Verdiğinden AT_FDCWD, unlinkve arasında etkili bir fark yoktur unlinkat.
Barmar

6
Ben sadece bir balık almak ya bazen SO :-) temel bir şekilde "Balık öğrenmek" çoğu zaman güçlü, esnek bir şekilde "balık öğrendik" Çünkü bu cevabı okumak için beni mutlu ediyor
adaçayı

20

POSIX, unlinkyardımcı programın C kütüphanesi unlinkişlevini çağırdığını ve başka bir şey olmadığını belirtir . Başka seçenek yok. Dizin olmayan bir şeye geçerli bir yol adı iletirseniz ve o nesnenin bulunduğu dizine yazma izniniz varsa, o unlinkzaman kaldırır.

rmbiraz başka bir işlevselliğe sahip olan ve pek de bir süperset olmayan geleneksel bir Unix komutudur unlink(aşağıya bakınız).

İlk olarak, rmgüvenlik kontrolleri yapar. rmYazma iznine sahip olmadığınız bir nesneyi denerseniz (kaldırma yetkisi ile ilgisi yoktur: doğrudan izinler!) rmYine de -fbelirtilmediği sürece reddeder . rmnormalde, dosya olmadığı gibi şikayet eder unlink; Bununla birlikte -f, rmşikayet etmez. Bu genellikle Makefiles'de ( clean: @rm -f $(OBJS) ...) kullanılır, bu nedenle make cleankaldırılacak hiçbir şey olmadığında başarısız olmaz.

İkinci olarak, etkileşimli olarak silme işlemini onaylama seçeneğine rmsahiptir -i.

Üçüncü olarak, rmsahip -ryinelemeli bir şeydir bir dizin, kaldırılması için unlinkC kütüphanesi işlevi bunu yapmaz, çünkü yapmak gerekli değildir.

Yardımcı unlinkprogram tam olarak soyulmamış değil rm. Bu şeyin bir alt kümesini gerçekleştirir rm, ama bunun bir kombinasyonudur anlambilim içeriyor rm ile -f ve rm olmadan -f .

Kendi izinlerinin ne olduğuna bakılmaksızın düzenli bir dosyayı silmek istediğinizi varsayalım. Ayrıca, dosya yoksa veya başka bir nedenden dolayı komutun başarısız olmasını istediğinizi varsayalım. Ne rm filene de rm -f filegereksinimleri karşılamaktadır. rm filedosya yazılabilir değilse reddeder. Ancak rm -f filedosya eksikse şikayet etmeyi ihmal eder. unlink fileişi yapar.

unlinkMuhtemelen tanıtıldı çünkü rmçok zekice: bazen sadece saf Unix unlinkanlambilimine sahip olmak istiyorsun : "Dizin izinleri izin veriyorsa lütfen bu dizin girişini kaldırın" .


2
Buradaki en net cevap bu. Aslında verir kullanma durumu için unlinksadece açıklayan farklılıklardan ziyade.
Joker,

19

Tek bir dosya ile, rm ve unlink aynı görevi yapmak, dosyayı kaldırmak. POSIX tanımlandığı gibi rmve unlinkher ikisi de unlink () sistem çağrısına çağrı yapar.

GNU'da rm, bu çağrılar () unlinkat eşdeğerdir sistemi aramayı unlink()veya Rmdir () yolu göreli bir yol belirtildiği durumlar dışında işlevi.

Not

Bazı sistemlerde, unlinkdizini de kaldırabilirsiniz. En azından GNU sisteminde, unlinkbir dizinin adını asla silemezsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.