Apa argumen yang hilang dari -exec?

15

Saya menggunakan perintah berikut untuk menghapus direktori, file dan direktori yang berumur lebih dari 30 hari, dan memindahkannya ke direktori arsip yang dapat saya hapus setelah beberapa minggu jika tidak ada yang meminta file mereka kembali. Direktori target memiliki subdirektori berdasarkan nama pengguna, demikian juga direktori arsip.

Ini adalah perintah yang saya gunakan:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Saya menyarankan versi modifikasi ini untuk menjawab pertanyaan pada ask ubuntu, pengguna lain mengedit kode untuk mengubah akhir baris \;karena +lebih cepat (dan lebih benar?). Lihat disini

Namun, menggunakan +cara ini berfungsi jika -execperintahnya adalah ls -lhtetapi tidak dalam perintah sebenarnya yang saya gunakan. Jika saya mencobanya dengan +saya mendapatkan pesan kesalahan:

find: missing argument to '-exec'

Saya tidak mengerti mengapa ini berperilaku seperti ini, atau apa perintah yang benar. Tolong jangan hanya mengirim koreksi perintah, saya ingin mengerti daripada hanya mengikuti saran secara membabi buta.

Arronikal
sumber
Apakah Anda mengacu pada jawaban ini ? Ini mungkin menjelaskan mengapa
Wilf
Terima kasih @Wilf Saya telah memperbarui untuk menunjukkan jawaban edit yang terjadi. Tautan yang Anda berikan, memiliki tautan lebih lanjut yang menjelaskannya dengan cara yang dapat diatasi oleh otak saya.
Arronical
Terima kasih @souravc dengan cara cyclic yang cemerlang bahwa pertanyaannya adalah oleh pengguna yang mengedit perintah saya! Akhirnya saya mendapatkannya +memasok beberapa argumen ke perintah yang sama, tetapi mvtidak bisa mengatasinya!
Arronical
@Arronical mv can, see my answer ^^
chaos

Jawaban:

19

Pengguna di pos itu mungkin mengatakan bahwa +tanda di akhir -execperintah lebih cepat, tetapi tidak mengapa.

Mari kita asumsikan findperintah mengembalikan file berikut:

/path/to/file1
/path/to/file2
/path/to/file3

-execPerintah normal ( -exec command {} \;) berjalan sekali untuk setiap file yang cocok. Sebagai contoh:

find ... -exec mv {} /target/ \;

Laksanakan:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Jika Anda menggunakan +tanda ( -exec command {} +) perintah dibangun dengan menambahkan beberapa file yang cocok di akhir perintah. Sebagai contoh:

find ... -exec mv -t /target/ {} +

Laksanakan:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Untuk menggunakan +flag dengan benar, argumen untuk memproses harus di akhir perintah, bukan di tengah. Itu sebabnya findmemberi missing argument to '-exec'contoh pada Anda; itu merindukan penutupan {}.

kekacauan
sumber
Saya selalu bertanya-tanya mengapa find -execmengharuskan {}untuk menjadi arg terakhir, ketika digunakan bersama +. Adakah yang tahu mengapa keputusan desain itu dibuat, alih-alih membiarkan konstruksi seperti pekerjaan baris perintah OP?
Peter Cordes
11

Pengguna menjelaskan hasil edit mereka ....

Terminator eksekutif '+' lebih cepat daripada '\;'  lihat /ubuntu/558817/what-is-the-ddference-between-using-and-in-ex--exec-command;  dan membuat file cadangan dari file asli adalah ide yang bagus

... menggunakan tautan ini . Saya pikir pada dasarnya alih-alih menggunakan beberapa perintah, ia mengirim semua nama file ke satu contoh perintah, untuk mempercepat. Ini adalah contoh dari sini :

Menggunakan -exec dengan tanda titik koma ( find . -exec ls '{}' \;), akan dijalankan

ls file1
ls file2
ls file3

Tetapi jika Anda menggunakan tanda plus sebagai gantinya ( find . -exec ls '{}' \+), semua nama file akan diberikan sebagai argumen untuk satu perintah:

ls file1 file2 file3

Ada bentuk lain yang tersedia menggunakan ;dan +juga (dari sini :)

Karena itu, contoh sintaks berikut diizinkan untuk menemukan perintah:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

NAMUN, saya tidak yakin ini akan bekerja dengan perintah pindah, karena itu sintaksnya mv [OPTION]... SOURCE DEST, kecuali -topsi atau serupa digunakan. Namun itu harus bekerja lstanpa opsi tambahan dll karena mereka dapat mengerti ketika beberapa nama file diberikan. The +juga mungkin perlu melarikan diri (yaitu \+)

Wilf
sumber
Keduanya jawaban yang bagus, tetapi saya harus memberikannya pada kekacauan karena menjadi sedikit lebih cepat, dan menjelaskan mv -t, keduanya +1!
Arronical