Sedangkan untuk find
perintah, Anda juga bisa menambahkan lebih banyak -exec
perintah dalam satu baris:
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Perhatikan bahwa perintah ini, dalam hasilnya, setara dengan menggunakan
chgrp -v new_group file && chmod -v 770 file
pada setiap file.
Semua find
's parameter seperti -name
, -exec
, -size
dan sebagainya, sebenarnya tes : find
akan terus berjalan satu per satu selama seluruh rantai sejauh ini dievaluasi untuk benar . Jadi setiap -exec
perintah berturut-turut dieksekusi hanya jika yang sebelumnya dikembalikan benar (yaitu 0
status keluar dari perintah). Tetapi find
juga memahami operator logika seperti atau ( -o
) dan tidak ( !
). Oleh karena itu, untuk menggunakan rangkaian -exec
tes terlepas dari hasil sebelumnya, orang perlu menggunakan sesuatu seperti ini:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
'{}'
(tanda kutip di sekitar kawat gigi), silakan kunjungi: unix.stackexchange.com/q/8647/4485sumber
-c
penanganan aneh $ 0 membuat saya berpikir ini salah setiap kali saya meliriknya, tapi itu pasti benar.sh -c
.Perintah Anda pertama-tama diuraikan oleh shell menjadi dua perintah yang dipisahkan oleh a
;
, yang setara dengan baris baru:Jika Anda ingin menjalankan perintah shell, aktifkan shell secara eksplisit dengan
bash -c
(ataush -c
jika Anda tidak peduli bahwa shell tersebut khusus bash):Perhatikan penggunaan
{}
sebagai argumen ke shell; itu adalah argumen nol (yang biasanya merupakan nama shell atau skrip, tetapi ini tidak masalah di sini), karenanya dirujuk sebagai"$0"
.Anda dapat mengirimkan beberapa nama file ke shell sekaligus dan membuat shell mengulanginya, itu akan lebih cepat. Di sini saya lulus
_
sebagai nama skrip dan argumen berikut adalah nama file, yangfor x
(pintasan untukfor x in "$@"
) berulang.Perhatikan bahwa sejak bash 4, atau di zsh, Anda tidak perlu menemukan sama sekali di sini. Dalam bash, jalankan
shopt -s globstar
(taruh di Anda~/.bashrc
) untuk mengaktifkan**/
berdiri untuk glob direktori rekursif. (Di zsh, ini aktif setiap saat.) Laluatau jika Anda ingin agar file-file tersebut diulang secara berurutan
Satu perbedaan dengan
find
perintah adalah bahwa shell mengabaikan file dot (file yang namanya dimulai dengan a.
). Untuk memasukkannya, dalam bash, set pertamaGLOBIGNORE=.:..
; di zsh, gunakan**/*(D)
sebagai pola glob.sumber
sh -c
.