Pertanyaan Apa argumen yang hilang untuk -exec?


Saya menggunakan perintah berikut ini untuk menghapus direktori, file dan direktori yang sudah 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, begitu juga dengan 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 tentang tanya ubuntu, pengguna lain mengedit kode untuk mengubah akhir baris \; untuk + karena lebih cepat (dan lebih tepat?). Lihat disini

Namun, menggunakan + dengan cara ini berfungsi jika -exec perintahnya ls -lh tetapi tidak dalam perintah sebenarnya yang saya gunakan. Jika saya mencobanya + Saya mendapat pesan kesalahan:

find: missing argument to '-exec'

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


15
2017-07-08 13:38


asal


Apakah Anda maksud jawaban ini? Inimungkin menjelaskan mengapa - Wilf
Terima kasih @Wilf Saya telah memperbarui untuk menunjukkan yang menjawab pengeditan yang terjadi. Tautan yang Anda berikan, memiliki tautan lebih lanjut yang menjelaskannya dengan cara yang dapat saya atasi. - Arronical
Melihat Apa perbedaan antara menggunakan '+' dan '\;' dalam perintah -exec? - souravc
Terima kasih @souravc dengan cara siklik yang cerdas yang dipertanyakan oleh pengguna yang mengedit perintah saya! Akhirnya saya mengerti +memasok beberapa argumen ke perintah yang sama, tetapi mv tidak bisa mengatasi itu! - Arronical
@Arronical mv dapat, lihat jawaban saya ^^ - chaos


Jawaban:


Pengguna di pos itu dapat mengatakan bahwa + tanda di akhir a -exec perintah lebih cepat, tetapi tidak mengapa.

Mari kita asumsikan find perintah mengembalikan file-file berikut:

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

Normal -exec perintah (-exec command {} \;) berjalan satu kali untuk setiap file yang cocok. Sebagai contoh:

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

Executes:

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/ {} +

Executes:

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

Untuk menggunakan + Tandai dengan benar argumen yang akan diproses harus berada di ujung perintah, bukan di tengah. S mengapa find melempar missing argument to '-exec' dalam contoh Anda; itu merindukan penutupan {}.


19
2017-07-08 14:00



Saya selalu bertanya-tanya mengapa find -exec membutuhkan {} menjadi arg terakhir, bila digunakan dengan +. Ada yang tahu mengapa keputusan desain itu dibuat, bukannya membiarkan konstruksi seperti kerja perintah OP? - Peter Cordes


Pengguna menjelaskan hasil edit mereka ....

  '+' exec's terminator is faster than '\;' see https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command; and creating a backup file from original file is good idea 

... menggunakan Link ini. Saya pikir pada dasarnya daripada menggunakan beberapa perintah, ia mengirimkan semua nama file ke satu contoh perintah, untuk mempercepat pekerjaan. Berikut ini contoh dari sini:

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

ls file1
ls file2
ls file3

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

ls file1 file2 file3

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

Oleh 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 bergerak, karena itu sintaksnya mv [OPTION]... SOURCE DEST, kecuali -t opsi atau yang serupa digunakan. Namun itu harus bekerja dengan ls tanpa opsi tambahan dll karena mereka dapat mengerti ketika beberapa nama file diberikan. Itu + mungkin juga perlu melarikan diri (mis. \+)


10
2017-07-08 14:00



Kedua jawaban yang bagus, tetapi saya harus memberikannya kepada kekacauan karena sedikit lebih cepat, dan menjelaskan mv -t, keduanya +1! - Arronical