Saya pikir saya cukup maju dalam menggunakan find tetapi SETIAP kali saya menggunakannya, saya tidak bisa seumur hidup saya mengingat metode untuk menutup opsi -exec. Saya menghabiskan banyak waktu membaca setiap kali saya menggunakannya. Apakah saya tidak cukup menggunakannya atau berharap terlalu banyak pada diri saya sendiri? Mari kita mulai dengan contoh khas yang membuat saya frustrasi.
Struktur direktori memiliki file dengan semua izin yang salah, file, tautan simbolis, dll. Saya ingin mengubah kepemilikan ke nilai yang wajar
find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;
(Maafkan saya jika endingnya terbalik ... Saya melihatnya satu jam yang lalu dan saya masih tidak yakin)
Tetapi saya takut untuk menjalankannya karena mount, tautan simbolik, dll. Saya telah membuat kesalahan besar chmod. * Dan membuatnya berulang pada saya sebelumnya. Saya tahu -xdev akan menghapus partisi tetapi saya tidak yakin apa yang akan terjadi pada file yang hidup di dalam direktori yang merupakan tautan simbolik.
Jadi bagaimana seseorang bisa menguasai makhluk buas ini yang bisa membunuh file-file penting?
Perbarui pemangkasan saran terbaik di bawah ini dan rangkum:
- Miliki direktori latihan yang ditautkan dan dipasang ke direktori latihan lainnya.
- Gunakan xargs daripada perintah exec non-intuitif.
- Gunakan -exec echo {} untuk kewarasan dan keamanan
- Semi usus besar adalah khusus dan Anda melarikan diri karena itu char melarikan diri adalah yang pertama
- Perintah -atau dapat membantu Anda menggabungkan kriteria seleksi.
Saya sedikit bingung tentang print0 tetapi xargs selalu sedikit pada tidak mudah dimengerti pada praktek pandangan pertama yang saya coba dan hindari.
sumber
Jawaban:
Nah, sejauh
-exec
sintaks berjalan, Anda bisa melakukan seperti banyak orang, menyerah dan menggunakanxargs
:(atau versi file-dengan-spasi-dan-omong kosong-di-mereka-aman)
Atau, untuk mencoba mengingat hal yang benar untuk dilakukan dengan titik koma, apa yang perlu Anda bor ke kepala Anda adalah bahwa Anda menggunakan titik koma untuk mengakhiri perintah yang
-exec
sedang berjalan, dan Anda harus melarikan diri dari titik koma karena memiliki titik koma. artinya untukbash
. Itulah sebabnya titik koma backslash. Anda tampaknya memiliki bagian{}
pengganti oke.Untuk membunuh file dan sebagainya, jika Anda menjalankan sesuatu yang besar dan berbahaya seperti yang Anda bicarakan, pertama-tama lakukan ini:
dan tinjau hasilnya. Ini pada dasarnya adalah "dry run" di mana Anda melihat perintah itu akan berjalan jika Anda membiarkannya. Praktik yang bagus. Tidak akan membantu dengan
.*
masalah, tetapi Anda tahu untuk tidak melakukannya sekarang. :)sumber
Saya terkejut belum ada yang menyebutkan opsi berikut:
Sintaks ini akan mengkonfirmasi perintah sebelum menjalankannya. Ini berfungsi paling baik jika Anda mengharapkan kecocokan Anda menjadi sejumlah kecil file karena itu akan meminta masing-masing.
Beberapa jawaban menyebutkan
xargs
, tetapi dengan GNU ternyata tidak perlu:Perhatikan bahwa tanda + biasanya tidak perlu diloloskan, tetapi ada baiknya untuk terbiasa dengan kebiasaan itu.
sumber
Inilah gunanya manusia: Sulit untuk mengingat hal-hal, itulah sebabnya * perintah nix mencakup halaman manual. Anda hanya dapat selalu memeriksa bagian ACTION dari halaman manual untuk pengingat pada sintaks:
man find
. Meskipun halaman manual tampaknya tidak ramah, begitu Anda bisa membacanya, mereka sangat berguna.Buat Front-End atau Wrapper: Ketika saya ingin menjadi lebih baik di GNU, saya menulis front end GUI untuk find yang menghasilkan perintah menemukan dengan python, glade, dan pygtk. Ini adalah latihan yang baik jika ingin mengenalnya dengan sangat baik.
Punya Direktori Praktek: Terakhir, saya selalu memiliki direktori 'memo' di direktori home saya untuk bermain dengan perintah yang kuat ketika sesuatu seperti 'echo' tidak memotongnya. Anda dapat menggunakan ekspansi shell untuk membuat banyak file dengan cepat seperti:
sumber
Anda juga dapat menggabungkan ekspresi temukan dengan operator '-dan' dan '-atau. -dan tersirat:
sama dengan
Operator atau dapat mengurangi daftar 4 perintah menjadi 2:
Dan akhirnya, tidak terkait untuk menemukan, tetapi chown juga dapat mengatur grup juga. Jadi, mengatasi spasi dalam nama juga kita berakhir dengan:
sumber
Saat menutup saya hanya berpikir untuk menggunakan; suka dengan banyak bahasa pemrograman dan kemudian menghindarinya. Ingatlah bahwa itu perlu untuk diloloskan dan itu datang kepada Anda dengan cukup mudah.
sumber
Tergantung pada versi menemukan yang Anda gunakan ada beberapa opsi yang dapat membantu Anda. GNU find mungkin yang paling kuat dan ini dapat membantu Anda dengan pertanyaan kedua Anda (tersirat)
Misalnya - perilaku default bukan untuk men-decereference tautan simbolik, tetapi Anda dapat menimpanya; dan opsi -mount berhenti menemukan melintasi titik mount
Lihat di halaman manual lokal Anda
sumber
Beberapa orang akan berpendapat bahwa opsi xargs lebih cepat daripada opsi -exec karena tidak akan mengeksekusi perintah sekali untuk setiap file, tetapi saya tidak akan khawatir tentang hal itu untuk apa pun kecuali pekerjaan besar mengambil jumlah waktu yang tidak sepele.
Secara pribadi, saya biasanya menjalankan find tanpa exec
pastikan bahwa output terlihat benar, dan kemudian jalankan perintah saya pada daftar itu.
sumber
Untuk beberapa shell (bukan bash) luput {} untuk perilaku yang benar.
menemukan manual bagus untuk menguasai find.
sumber
Sebelum Anda melakukan hal seperti ini, pastikan direktori tempat Anda menjalankan perintah ini tidak berada di sistem file yang sama dengan / usr atau / etc. (Jika tidak, jika saya memiliki tautan keras ke / etc / passwd atau ke / bin / sh di direktori home saya, Anda baru saja memberi saya kepemilikannya dan sebagai efek samping, saya sekarang memiliki mesin).
Jika Anda ingin berulang melalui direktori dan chown semua file / direktori, sederhana
chown -Rh pengguna: usergroup user /
akan melakukannya. Membuat yakin Anda menggunakan h atau chown akan mengikuti link simbolik.
sumber