Apa perbedaan antara membatalkan tautan dan rm?

64

Apakah memutuskan tautan lebih cepat dari rm?

Marcin
sumber
9
"Optimalisasi prematur adalah akar dari semua kejahatan (atau setidaknya sebagian besar) dalam pemrograman." - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth
chris

Jawaban:

68

Keduanya adalah pembungkus untuk fungsi dasar yang sama yaitu unlink()panggilan sistem.

Untuk menimbang perbedaan antara penggunaan pengguna lahan.

rm(1):

  • Lebih banyak pilihan.
  • Lebih banyak umpan balik.
  • Pemeriksaan kewarasan.
  • Sedikit lebih lambat untuk satu panggilan sebagai akibat dari hal di atas.
  • Dapat dipanggil dengan beberapa argumen sekaligus.

unlink(1):

  • Pengecekan kewarasan kurang.
  • Tidak dapat menghapus direktori.
  • Tidak dapat berulang.
  • Hanya dapat mengambil satu argumen pada satu waktu.
  • Sedikit lebih ramping untuk satu panggilan karena kesederhanaannya.
  • Lebih lambat jika dibandingkan dengan memberikan rm(1)banyak argumen.

Anda dapat menunjukkan perbedaannya dengan:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

Namun jika kita berbicara tentang panggilan yang tidak tercemar ke unlink(2)fungsi sistem , yang sekarang saya sadari mungkin bukan apa yang Anda perhitungkan.

Anda dapat melakukan sistem unlink()pada direktori dan file yang sama. Tetapi jika direktori tersebut adalah induk dari direktori dan file lain, maka tautan ke induk tersebut akan dihapus, tetapi anak-anak akan dibiarkan menggantung. Yang kurang ideal.

Sunting:

Maaf, diklarifikasi perbedaan antara unlink(1)dan unlink(2). Semantik masih akan berbeda antar platform.

Dan Carley
sumber
Apakah itu berarti bahwa dalam sistem file unix menghapus direktori dan secara rekursif semua file di bawahnya akan selalu menjadi operasi yang sebanding dengan jumlah file / direktori yang dikandungnya? Kapan terjadi ketika saya memutuskan tautan direktori yang merupakan induk dari direktori / file lain? Tidak pernah terhapus dan saya kehilangan ruang ini selamanya?
Marcin
6
Secara teknis dimungkinkan meninggalkan direktori / file yatim di sebagian besar jika tidak semua sistem file. Memperbaiki ini umumnya berarti menjalankan alat perbaikan sistem file. Di Unix / Linux, alat-alat ini dikenal sebagai 'fsck' dan beberapa variasi spesifik untuk sistem file yang berbeda. Jika mereka memulihkan sesuatu, mereka biasanya akan meninggalkannya dalam direktori yang disebut 'hilang + ditemukan'
ConcernedOfTunbridgeWells
1
Benar. rm akan muncul kembali dari bawah pohon ke atas. Anda dapat menunjukkan bagaimana dengan: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Jika Anda membatalkan tautan direktori induk, maka ruang yang dikonsumsi oleh anak-anak harus hilang sampai saat fsck menemukan perbedaan tersebut.
Dan Carley
1
Apa yang kau bicarakan? $ mkdir -p 1/2/3 $ unlink 1 unlink: tidak dapat membatalkan tautan `1 ': Apakah direktori Pengguna menyebabkan kebocoran" memori "yang membutuhkan fsck? Tidak sepertinya!
Thomas
1
Linux dan FreeBSD manual secara eksplisit menyatakan bahwa ia akan gagal ketika mencoba menjalankan pembatalan tautan () pada direktori.
Thomas
8

Pada tingkat spesifikasi POSIX, apa yang dilakukan rm ditentukan jauh lebih ketat daripada yang dilakukan tautannya .

Portabilitas hasil tampaknya lebih baik menggunakan rm, jika skrip Anda harus berjalan di OS.

Mike G.
sumber
4

Bagian lambat dari penghapusan adalah kode sistem file dan hal-hal disk, bukan persiapan userspace dari pemutusan sistem ().

Yaitu: jika perbedaan kecepatan penting, maka Anda tidak boleh menyimpan data pada sistem file.

batalkan tautan hanya "cahaya" rm. rm memiliki lebih banyak fitur tetapi mereka melakukan hal yang sama.

Thomas
sumber