UNIX bulma komutunu nasıl yönetirim?


11

Ben bulmak benim kullanımı oldukça ileri olduğunu düşünüyorum ama HER kullanımım her zaman -exec seçeneği kapatmak için yöntemi hatırlıyorum benim yaşam için hatırlayamıyorum. Her kullandığımda çok fazla zaman harcıyorum. Sadece yeterince kullanmıyor muyum veya kendimden çok fazla şey beklemiyor muyum? Haydi beni hayal kırıklığına uğratan tipik bir örnekle başlayalım.

Dizin yapısı tüm yanlış izinleri olan dosyaları sembolik bağlantılar vb gizli dosyaları vardır. Ben makul bir değere sahiplik değiştirmek istiyorum

find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;

(Sonu geriye giderse beni affet ... Bir saat önce baktım ve hala emin değilim)

Ama bağlar, sembolik bağlantılar, vb.Nedeniyle çalıştırmaktan korkuyorum. Chmod'un nihai işini yaptım. * -Xdev'in bölümleri keseceğini biliyorum ama sembolik linkler olan dizinlerde yaşayan dosyalara ne olacağından emin değilim.

Öyleyse, hayati dosyaları öldürebilen bu canavar nasıl ustalaşır?

Güncelleme altında iyi önerileri budama ve özetleme:

  1. Diğer uygulama dizinlerine bağlı ve bağlı bir uygulama dizini bulundurun.
  2. Sezgisel olmayan exec komutu yerine xargs kullanın.
  3. Akıl sağlığı ve güvenliği için -exec echo {} kullanın
  4. Yarı kolon özeldir ve bundan kaçıyorsunuz, bu yüzden kaçış karakteri önce
  5. -VEYA komutu seçim ölçütlerini birleştirmenize yardımcı olabilir.

Ben print0 hakkında biraz kafam karıştı ama xargs her zaman denemek ve kaçınmak ilk bakışta pratik kolay değil biraz olmuştur.


1
Ben de hatırlayamıyorum, bu yüzden sadece xargs'a bağladım.
rezonatör

2
Doğru komutu oluşturmaktan memnun olduğunuzda, \ yerine + ile çalıştırmayı düşünün; + İle daha hızlı çalışacaktır, çünkü exec komutu daha az sıklıkta çağrılacaktır.
wzzrd

wzzrd, \ yerine + kullanımı hakkında harika ipucu;
Daniel Lawson

Yanıtlar:


19

Eh, bildiğim kadarıyla -execsözdizimi giderse birçok insan gibi yapabilirdi, yukarı ve kullanımı vermek xargs:

find . -type f | xargs chown username

(veya boşluklu dosyalar ve diğer güvenli dosyalar)

find . -type f -print0 | xargs -0 chown username

Veya, noktalı virgülle ilgili doğru şeyi hatırlamaya çalışmak için, kafanıza delmeniz gereken şey , çalışan komutu sonlandırmak için noktalı virgül kullanmanız ve noktalı virgülten kaçmanız gerektiğidir , çünkü özel anlamı . Bu yüzden ters eğik noktalı virgül. Yedek parça iyi görünüyor .-execbash{}

Dosyaları öldürmek ve bunun gibi, eğer bahsettiğiniz gibi büyük ve tehlikeli bir şey çalıştırıyorsanız, önce bunu yapın:

find . -type f -exec echo chown username {} \;

ve sonuçları gözden geçirin. Bu, temel olarak, izin verirseniz çalışacağı komutları gördüğünüz bir "kuru çalışma" dır. Kesinlikle iyi bir uygulama. .*Soruna yardım etmeyecek , ama şimdi bunu yapmamayı biliyorsun. :)


1
+! 'echo' uygulaması için kuru çalışma. Bunu her zaman büyük bir değişiklik için kullanıyorum
Steve Folly

3

Kimsenin aşağıdaki seçeneklerden henüz bahsetmediğine şaşırdım:

find . -type f -ok chown username {} \;

Bu sözdizimi komutu çalıştırmadan önce doğrular. Eşleşmenizin nispeten az sayıda dosya olmasını beklerseniz en iyi sonucu verir çünkü her biri için komut isteminde bulunur.

Bazı cevaplar bahsediyor xargs, ancak GNU ile de bunun gereksiz olduğunu buluyor:

find . -type f -exec chown username {} \+

+ 'Nın genellikle kaçması gerekmediğini, ancak yine de bunu yapma alışkanlığına girmenin iyi olduğunu unutmayın.


Artı işaretinin doğasını açıklayabilir misiniz ... tam olarak ne yapıyor? Kabuk işliyor mu yoksa komut mu. Ben ilginç bir konu çünkü gnu-find için kaynak kodunu indireceğim düşünüyorum.
ojblass

find işliyor. Bu seçenek hakkında daha fazla bilgi edinmek için adamı bulmak okuyun.
Kamil Kisiel

3

İnsanın amacı budur: Bir şeyleri hatırlamak zor olabilir, bu yüzden * nix komutu man sayfalarını içerir. Sen her zaman sözdizimi bir hatırlatıcı için adam sayfasının EYLEM bölümünü kontrol edebilirsiniz: man find. Her ne kadar man sayfaları dostça görünmese de, bunları okuduktan sonra çok kullanışlıdır.

Bir Ön Uç veya Sarmalayıcı Yap: GNU'da daha iyi olmak istediğimde , python, glade ve pygtk ile bulma komutları üreten bulmak için bir GUI ön ucu yazdım . Gerçekten iyi tanımak istiyorsanız bu iyi bir egzersizdir.

Bir Uygulama Dizini Var: Son olarak, 'echo' gibi bir şey kesmediğinde güçlü komutlarla oynamak için ev dizinimde her zaman bir 'not' dizinim var. Kabuk genişletmeyi aşağıdaki gibi bir şeyle hızlı bir şekilde bir grup dosya oluşturmak için kullanabilirsiniz:

for i in {1..100}; do touch "$i"; done

Garip bir alıştırma dizini hiç düşünmediğim bir şey.
ojblass

1

Bul ifadelerini '-ve' ve '-veya' operatörleriyle de birleştirebilirsiniz. -ve örtük:

find . -type f -name "plainfile" ...

aynıdır

find . -type f -and -name "plainfile" ...

Veya operatörü 4 komut listenizi 2'ye düşürebilir:

find . -type d -or -type f ...

Ve son olarak, bulmakla ilgili değil, ama chown grubu da ayarlayabilir. Yani, isimlerdeki boşluklarla başa çıkmanın yanı sıra:

find . -type d -or -type f -exec chown username:usergroup '{}' \;

-Veya iş ne bulmak. [Sic]
ojblass

@ojblass: find, 've' veya 'veya' kullanarak ifadeleri birleştirir, varsayılan olarak '-ve' veya '-veya' belirtilmezse, '-ve' dolaylı olarak kullanılır. Bu yüzden 'find -type d -type f' yazın hiçbir şey bulamaz çünkü hiçbir şey bir dizin ve dosya değildir.
Steve Folly

0

Kapatırken sadece kullanmayı düşünüyorum; birçok programlama dilinde olduğu gibi bundan kaçıyor. Sadece bunun kaçması gerektiğini ve size oldukça kolay geldiğini unutmayın.


0

Kullandığınız bulmanın sürümüne bağlı olarak, size yardımcı olabilecek farklı seçenekler vardır. GNU bulması muhtemelen en güçlü olanıdır ve bu ikinci (zımni) sorunuzda size yardımcı olabilir

Örneğin - varsayılan davranış, sembolik bağlantıları serbest bırakmak değil, bunu geçersiz kılabilirsiniz; ve -mount seçeneği bağlanma noktalarında ilerlemeyi bulmayı durdurur

Yerel adam sayfalarınıza bakın


0

Bazıları tartışırdı , xargs seçeneğinin -exec seçeneğinden daha hızlı olduğunu, çünkü her dosya için bir kez komutu yürütmeyeceğini eder, ancak önemsiz bir zaman alan büyük işler dışında bir şey için endişelenmeyeceğim.

Şahsen ben genellikle exec olmadan find çalıştırıyorum

find /path/to/dir -name whatever

çıktının doğru göründüğünden emin olun ve komutumu bu listede çalıştırın.

chown user:group `find /path/to/dir -name whatever`

Bir şeylerin nasıl yapılamayacağının mükemmel bir örneği. Boşluklu dosya adları.
Ian Kelling

Evet, belki de kabul etmem gereken potansiyel bir problem. Ancak benim açımdan, boşlukları veya başka bir dosya adı deliliğini bulacağınız bir şeyi çalıştırmadan önce bul çıktısını okumakla ilgiliydi.
theotherreceive

0

Bazı mermiler için (bash değil) doğru davranış için {} kaç.

\{\} or '{}'

manuel bulmak bulmak bulmak için iyidir.


Hayır yapmazsınız; find, oldukları gibi {} ile iyi çalışır. Onlar find komutunun bir parçasıdır: find komutunun sonucu ile değiştirilen bir simgedir. Fonksiyonları tanımlarken veya değişkenleri çağırırken sadece bash'da bir şey ifade ederler, böylece sadece orijinal sorudaki gibi kullanabilirsiniz.
wzzrd

Bu adam sayfasından. Ben bash için geçerli olmadığını söylemek güncellendi.
Ian Kelling

0

Bunun gibi bir şey yapmadan önce, bu komutu çalıştırdığınız dizinin / usr veya / etc ile aynı dosya sisteminde olmadığından emin olun. (aksi takdirde ana dizindeki / etc / passwd veya / bin / sh için sabit bir bağlantım varsa, bunların sahipliğini bana verdiniz ve bir yan etki olarak artık makineye sahibim).

Bir dizini tekrarlamak ve tüm dosyaları / dizinleri seçmek istiyorsanız, basit bir

chown -Rh kullanıcı: kullanıcı grubu kullanıcısı /

yapacağım. Make emin sen -h kullanmak veya chown sembolik bağları izler.


Bunun çapraz platform olduğunu düşünmüyorum. Ayrıca benim çalışma ortamı tarafından gösterildiği gibi 247K dosyaları ile başarısız. Neden olduğundan emin değilim.
ojblass

Bir platform arası sorun bulduğunuzdan daha fazla bir hata bulduğunuzu düşünüyorum. Hangi sürüm ve başarısız olduğunda çıkış durumu nedir? İlk söyleyebildiğim kadarıyla ilk bsd sürümlerinde ortaya çıktı; kesinlikle Sunos 5.3 ve ultrix ve irix'te. Başarısız olmadan kaç işlem yapar?
chris

AIX 5.3, AIX 5.2'de çalışıyor, ancak AIX 4.3, NCR, HP 11, HP 10.20 veya DSL dağıtımlarımda çalışmıyor. Her durumda, 60k dosyalarda veya yakınında başarısız gibi görünüyor.
17'de ojblass
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.