Chmod komutunu seçici olarak kullan


11

Belirli bir dizin altındaki tüm dosyalarda ve alt dizinlerde 755 iznini ayarlamak istiyorum, ancak yalnızca 755 iznine sahip olmayan bileşenler için chmod 755'i yürütmek istiyorum.

find /main_directory/ -exec chmod 755 {} \;

Eğer findkomut uzun bir liste döndürür bu çok zaman alacaktır. Ben her bir bileşenin Sekizli dosya düzeyi iznini kontrol etmek için komut komutu kullanabilirsiniz ve daha sonra dosya izni değiştirmek için if-else kullanın, ancak kullanarak findve xargsilk dosya / dizinin hangi izni olduğunu kontrol etmek için herhangi bir tek satır yaklaşım var biliyorum ve ardından chmodbaşka bir şeye ayarlanmışsa 755 olarak değiştirmek için kullanın.


6
Bu erken optimizasyon olabilir ve daha hızlıysa bile yapamayabilir. Tüm bu kontrollerin yapılması onu yavaşlatabilir. Daha hızlı olduğundan emin olmak için test yapmak, ancak bunu çok yapmak zorunda kalırsanız ödeyecektir.
ctrl-alt-delor

3
Muhtemelen tüm dosyalara yürütme izni vermek istemezsiniz. Bu bir güvenlik riski oluşturacaktır. (Bu, Microsoft'un Windows'undaki virüs vektörlerinden biridir: her şey yürütülebilir). Sembolik modda şunu söyleyebilirsiniz u+rw,go+r,go-w,ugo+X- başkente dikkat edin.
ctrl-alt-delor

@ Ctrl-alt-delor ile hemfikirim ama sorduğunuza daha yakın bir şey önerirsiniz, u = rwX, go = rX, aynı şeyi başarmalıdır.
penguin359

Yanıtlar:


21

755Hem dosyalarda hem de dizinlerde izinleri değiştirmek istiyorsanız find(en azından performans açısından) kullanmanın gerçek bir yararı yoktur ve

chmod -R 755 /main_directory

findZaten izinleri olan şeylerin izinlerini değiştirmek için 755(ctime zaman damgasını güncellemekten kaçınmak için) gerçekten kullanmak istiyorsanız , her dizindeki ve dosyadaki geçerli izinleri de test etmelisiniz:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

-exec ... {} +Geçer mümkün olduğunca çok sayıda yol adlarının olarak toplayacak ! -perm 0755testi ve yürütmek chmodseferde hepsi üzerinde.

Genellikle, dosya ve dizinlerdeki izinleri ayrı ayrı değiştirmek istersiniz, böylece tüm dosyalar yürütülebilir değildir:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

Cazibe gibi çalıştı, teşekkür ederim. Saygılarımızla, Kumarjit
Kumarjit Ghosh

1
Burada kullanmak +yerine bunun ;büyük bir fark yarattığından şüpheleniyorum .
Kevin

Bu hızlı bir yoldur - çekten kaçının. Ben sadece değiştirmek için izin verdiğiniz dosyaların bir listesini yapmak için find kullanmak istiyorsunuz değiştiremezsiniz dosyaları chmod hata dışarı kaçınacaktır. <pre> <code> # rwx, rw, wx, w yalnızca bulur. -kullanıcı $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # iki işlem kırmak bulmak. -kullanıcı $ (whoami) -perm / 002! -perm 0755> $ (</ tmp / chfiles.txt) içindeki dosya için /tmp/chfiles.txt chmod --quiet 0755 "$ {file}" bitti </code> </pre>
Chris Reid

@ChrisReid Herhangi bir yol adı boşluk karakteri içeriyorsa, böyle bir yol adı listesi üzerinde döngü yapmanın bozulacağını unutmayın.
Kusalananda

Sanırım İç Alan Ayırıcısını (IFS) bir komut dosyasında '\ n' olarak değiştirmeniz gerekiyor. Bunlar, ortam ayarlarıdır, kabuğun bunları yorumlama şekli bu ayarların değerlerine bağlıdır. Dosyaları yeniden adlandırma veya üzerine yazma gibi korkunç distasterleri ortaya çıkarmak için kullanmadan önce kukla dosyalarda komut dosyalarını test ederim. IFS ayarının kabuk printf yolunu seviyorum. IFS = $ (printf "\ n") # çok okunabilir
Chris Reid

1

Şöyle findaldık -exec ... +orada kullanarak çok noktası değil, sözdizimi xargsbunun için sormak olarak değil:

find /main_directory -not -perm 0755 | xargs chmod 755

1
Ayrıca , potansiyel saldırganın boşlukları veya diğer özel karakterleri içeren dosya adları oluşturabilmesi durumunda, bulunmayan xarg'ların -0( -print0bulma ile birlikte ; GNU uzantısıdır) oldukça sorunlu olabileceğini unutmayın. -execNe zaman sen-ebilmek sopa daha iyi
Matija Nalis

Gerek yok xargs(sadece kullanın -exec) ve eğer bunu kullanırsanız Matija'nın dediği gibi -print0/ kullanmalısınız -0.
Kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.