Perintah Anda pertama-tama diuraikan oleh shell menjadi dua perintah yang dipisahkan oleh a ;
, yang setara dengan baris baru:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Jika Anda ingin menjalankan perintah shell, aktifkan shell secara eksplisit dengan bash -c
(atau sh -c
jika Anda tidak peduli bahwa shell tersebut khusus bash):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
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, yang for x
(pintasan untuk for x in "$@"
) berulang.
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
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.) Lalu
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
atau jika Anda ingin agar file-file tersebut diulang secara berurutan
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
Satu perbedaan dengan find
perintah adalah bahwa shell mengabaikan file dot (file yang namanya dimulai dengan a .
). Untuk memasukkannya, dalam bash, set pertama GLOBIGNORE=.:..
; di zsh, gunakan **/*(D)
sebagai pola glob.
'{}'
(tanda kutip di sekitar kawat gigi), silakan kunjungi: unix.stackexchange.com/q/8647/4485