Komutunuz önce kabuk tarafından a ile ayrılan ve ;
yeni bir satıra eşdeğer olan iki komuta ayrıştırılır :
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
Bir kabuk komutu çalıştırmak istiyorsanız, açıkça bir kabuğu çağırın bash -c
(ya sh -c
da kabuğun özel olarak bash olmasını umursamıyorsanız):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
Kabuğa {}
bir argüman olarak kullanımına dikkat edin; Bu, sıfırıncı argümandır (normalde kabuk veya komut dosyasının adıdır, ancak burada bunun önemi yoktur), bu nedenle referans olarak verilir "$0"
.
Bir seferde birden fazla dosya adını kabuğa iletebilir ve kabuğun içini yinelemesini sağlayabilirsiniz, daha hızlı olacaktır. Burada _
komut dosyası adı olarak geçiyorum ve aşağıdaki argümanlar for x
(kısayol için for x in "$@"
) yinelenen dosya adlarıdır .
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
Bash 4 veya zsh dilinde olduğundan, burada hiçbir şey bulmanıza gerek olmadığını unutmayın. Bash, özyinelemeli bir dizin glob için ayakta aktif hale shopt -s globstar
getirmek için çalıştırın (içine koymak ~/.bashrc
) **/
. (Zsh'de, bu her zaman etkindir.) Sonra
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
veya dosyaların sırayla yinelenmesini istiyorsanız
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
Komuttaki bir fark find
, kabuğun nokta dosyalarını (yani adı a ile başlayan dosyaları) görmezden gelmesidir .
. Bunları dahil etmek için bash olarak ilk küme GLOBIGNORE=.:..
; zsh içinde, **/*(D)
glob kalıbı olarak kullanın .
'{}'
(diş tellerinin etrafındaki kesme işaretini) açıklayabilirseniz, lütfen şu adresi ziyaret edin: unix.stackexchange.com/q/8647/4485