Apa sintaks -exec find yang benar

10

Saya ingin menghapus file yang lebih besar dari 2MB dalam folder tertentu. Jadi saya berlari:

find . -size +2M

Dan saya mendapat daftar dua file

./a/b/c/file1

./a/f/g/file2

Jadi saya jalankan:

find . -size +2M -exec rm ;

dan saya mendapatkan pesan kesalahan Find: missing argument to -exec

Saya memeriksa sintaks di halaman manual dan dikatakan -exec command ;

Jadi alih-alih saya coba

find . -size +2M -exec rm {} +

Dan itu berhasil. Saya mengerti bahwa {} membuatnya mengeksekusi perintah seperti rm file1 file2bukan rm file1; rm file2;.

Jadi mengapa yang pertama tidak berhasil?

MENJAWAB:

Saya kira saya hanya perlu RTFM beberapa kali untuk akhirnya mengerti apa yang dikatakannya. Meskipun contoh pertama tidak menunjukkan {}, kurung diperlukan dalam semua kasus. Dan kemudian tambahkan \; atau + tergantung pada metode yang diinginkan. Jangan hanya membaca tajuknya. Baca deskripsi juga. Oke.

Safado
sumber

Jawaban:

16

Anda dapat menggunakan salah satu formulir:

find . -size +2M -exec rm {} +

find . -size +2M -exec rm {} \;

Titik koma harus diloloskan!

Khaled
sumber
10
-exec rm {} \;

Anda dapat menggunakan .. manusia temukan

-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.
dSoultanis
sumber
1
Ah, baiklah. Saya kira saya hanya perlu RTFM beberapa kali untuk akhirnya mengerti apa yang dikatakannya. Meskipun contoh pertama tidak menunjukkan {}, kurung diperlukan dalam semua kasus. Dan kemudian tambahkan \; atau + tergantung pada metode yang diinginkan. Oke.
Safado
2

Demi efisiensi, Anda biasanya lebih baik menggunakan xargs:

$ find /path/to/files -size +2M -print0 | xargs -0 rm
EEAA
sumber
1
Tidak juga. Seperti entri Panduan pada wiki Greg mengatakan: The + (bukan;) di akhir tindakan -exec memberitahu find untuk menggunakan fitur seperti xargs internal yang menyebabkan perintah rm dipanggil hanya sekali untuk setiap potongan file, alih-alih satu kali per file.
adaptr
Ahh, menarik. Saya telah menggunakan + xargs selama bertahun-tahun, dan saya tidak pernah tahu tentang operator +. Terima kasih telah menunjukkan itu!
EEAA
Saya sepenuh hati dapat merekomendasikan wiki Greg; orang ini tahu lebih banyak tentang bash dan perangkat GNU daripada yang bisa kuharapkan untuk dipelajari; aman untuk mengatakan saya belajar lebih banyak tentang menggunakan bash sejak saya mulai membacanya daripada di semua tahun sebelumnya.
adaptr
2
Siapa Greg dan di mana saya dapat menemukan wiki-nya?
Safado
@Safado Saya rasa ini yang ini: mywiki.wooledge.org
Enrico Stahn
0

Saya tidak akan menggunakan -exec sama sekali untuk ini. find juga dapat menghapus file itu sendiri:

find . -size +2M -delete

(ini mungkin GNUism, tidak tahu apakah Anda akan menemukan ini di non-gnu find)

rebus
sumber
Apakah ada alasan di balik ini atau hanya karena preferensi pribadi?
Safado
temukan panggil saja tautan (2) itu sendiri dan tidak perlu memotong proses baru untuk melakukan penghapusan. Akan jauh lebih efisien. Ini juga jauh lebih mudah dibaca.
rebus
0

Seperti yang didokumentasikan, -exec membutuhkan {} sebagai pengganti untuk hasil dari find.

Panduan pasti untuk menggunakan alat bash dan GNU ada di sini

Seperti yang Anda lihat, itu secara eksplisit menunjukkan perintah kedua yang Anda gunakan sebagai contoh.

adaptr
sumber