GNU/Linux >> Belajar Linux >  >> Linux

temukan:-exec rm {} \; vs. -delete - mengapa yang pertama direkomendasikan secara luas?

tl;dr:-delete tidak diperlukan oleh POSIX, -exec adalah.

Fakta

Halaman manual POSIX 1003.1 untuk find menentukan -exec tapi bukan -delete .

Ini berarti -exec harus bekerja hampir di mana-mana. Saya akan terkejut menemukan find yang memiliki -delete tanpa -exec . Kebalikannya sangat mungkin. Terutama sistem ringan yang menggunakan busybox cenderung hanya menyediakan opsi baris perintah dasar.

Misalnya. Saya memiliki OpenWRT di salah satu router saya dan find memahami -exec , itu tidak mengerti -delete .

Tidak memiliki -delete bukan masalah besar bila Anda memiliki -exec rm … . Di sisi lain -delete tidak dapat menggantikan -exec secara umum. Ini adalah desain yang bijaksana untuk memungkinkan menghilangkan -delete pertama.

Pengalaman pribadi, observasi, dan opini

Di atas harus menjadi alasan utama mengapa -exec rm {} \; sangat direkomendasikan. Sekunder mungkin efek bola salju. Pengguna membaca artikel dan contoh, mengenal -exec dan publikasikan perintah mereka sendiri (mis. di sini di Pengguna Super). Beberapa dari mereka bahkan mungkin tidak mengetahui -delete ada.

Beberapa kali saya melihat (atau memberikan) komentar seperti 'Anda dapat menggunakan -delete alih-alih'. Dan tanggapannya seperti 'Terima kasih, saya tidak tahu itu'. Saya tidak ingat ada jawaban 'Saya tahu, tapi ini bukan POSIX'.

Setelah mengatakan semua ini saya cenderung menyebutkan -delete kapanpun -exec rm {} \; muncul. Alasannya adalah -delete tidak memunculkan proses baru, sedangkan -exec rm {} \; memanggil rm yang terpisah untuk setiap file yang cocok. Jika Anda tidak dapat menggunakan -delete maka pikiran Anda selanjutnya adalah -exec rm {} + yang dapat menghapus banyak file dengan satu rm (masih akan memanggil rm lebih dari sekali jika diperlukan).

Mengapa bukan -exec … + direkomendasikan secara luas? Mungkin karena keterbatasannya. Saya dapat membayangkan pengguna yang tidak berpengalaman berpikir 'Ini berfungsi dengan rm , izinkan saya menggunakannya dengan mv !' Lalu -exec mv {} foo/ + tidak berfungsi karena {} harus di akhir, tepat sebelum + . Pengguna menjadi frustrasi dan berlari kembali ke mama jendela.

Merekomendasikan -delete biasanya aman di sini di Pengguna Super, menurut saya. Sebagian besar pertanyaan menentukan OS "besar", find perintah di sana kaya dengan opsi. Dan bahkan jika ada pengguna yang memiliki find terbatas saya mungkin akan mendapatkan umpan balik. Dia mengatakan solusinya tidak bekerja untuk mereka dan saya menyarankan -exec rm … sebagai gantinya, jelaskan masalahnya, dll.

Artikel mandiri yang merekomendasikan -delete tidak akan mendapatkan umpan balik seperti itu. Jika ada masalah, pengguna cukup membuka tautan berikutnya yang dikembalikan oleh Google.


Perbedaannya terletak pada fleksibilitas. Jika Anda menggunakan -exec maka Anda menjalankan perintah untuk setiap file yang dipilih. Jika Anda menggunakan -exec maka Anda memiliki fleksibilitas untuk menerapkan opsi pencarian lainnya. Dengan -delete Anda dilarang menggunakan -prune. Selain itu, penempatan -delete Anda memengaruhi hasil Anda. Lihat cuplikan dokumentasi di bawah:

-delete
    Delete  files;  true  if removal succeeded.  If the removal failed, 
    an error message is issued.  If -delete fails, find’s exit status will be
        nonzero (when it eventually exits).  Use of -delete automatically turns on 
    the ‘-depth’ option.

    Warnings: Don’t forget that the find command line is evaluated as an 
    expression, so putting -delete first will make find try to delete every-
    thing  below  the  starting  points  you  specified.   When testing a find 
    command line that you later intend to use with -delete, you should
    explicitly specify -depth in order to avoid later surprises.  
    Because -delete implies -depth, you cannot  usefully  use  -prune  and  -delete
    together.

-exec command ;
    Execute  command;  true  if 0 status is returned.  All following arguments 
    to find are taken to be arguments to the command until an argument
    consisting of ‘;’ is encountered.  The string ‘{}’ is replaced by the 
    current file name being processed everywhere it occurs in the arguments
    to  the  command, not just in arguments where it is alone, as in 
    some versions of find.  Both of these constructions might need to be escaped
    (with a ‘\’) or quoted to protect them from expansion by the shell.  
    See the EXAMPLES section for examples of the use of  the  -exec  option.
    The specified command is run once for each matched file.  The 
    command is executed in the starting directory.   There are unavoidable security
    problems surrounding use of the -exec action; you should use the -execdir 
    option instead.

-exec command {} +
    This variant of the -exec action runs the specified command on the 
    selected files, but the command line is built by appending  each  selected
    file name at the end; the total number of invocations of the command 
    will be much less than the number of matched files.  The command line is
    built in much the same way that xargs builds its command lines.  
    Only one instance of ‘{}’ is allowed within the  command.   The  command  is
    executed in the starting directory

Linux
  1. Mengapa Server Memblokir IP Saya?

  2. Mengapa Find Tidak Menerima '-exec Cp {} Dir +'?

  3. Temukan -exec + Vs Temukan | Xargs:Yang Mana Yang Harus Dipilih?

  1. Mendapatkan Opsi -exec Di Temukan Untuk Bekerja?

  2. Temukan Komputer Di Jaringan Lan?

  3. temukan -exec fungsi shell di Linux?

  1. Alternatif yang ramah untuk menemukan alat di Linux

  2. Di mana file header <conio.h> di Linux? Mengapa saya tidak dapat menemukan <conio.h>?

  3. Mengapa segmen .bss diperlukan?