Bir Linux komutunda “{} \;” ne anlama geliyor?


37

Bazen aşağıdaki komutu görüyorum:

find . -name  * -exec ls -a {} \;

Bunu yapmam istendi.

{} \;Burada ne anlama geliyor?


1
-name *gereksizdir.
Kevin,

3
Ayrıca, bunun gibi diğer soru türleri için açıklamayı kontrol edin . İşte emirinizin çıktısı. .
Glutanimate,

8
-name *gereksizden daha kötüdür. Çünkü *işlem görmeyen, kabuk beklenmeyen sonuçlar ya da bir hata mesajı giden, boşluk yanlış tedavi edilen, mevcut klasörde dosya isimlerinin listesine genişler. Ekstra bir nokta olarak, findbunlardan biri dosyaları listelemek olan birçok işlevi vardır; bu kullanmak zorunda kalmaz -exec. Örneğin, find . -printveya kullanabilirsiniz find . -ls. Ya ters eğik çizgi ile yaptığı gibi,: Son olarak, noktalı virgül kaçmak için iki yol vardır \;, ya da alıntı yaparak: ';'. Hangisini daha rahat hissederseniz kullanın.
Paddy Landau

Yanıtlar:


48

Eğer kaçarsan findile exec, {}her dosya veya dizin ile bulunan bir dosya adına genişler find(böylece lssizin örnekte bir argüman olarak her FOUND dosya alır - bu aramaları not olduğunu lsya da her dosya bulunamadı kez belirttiğiniz diğer her türlü komutu).

Noktalı virgül ;, tarafından yürütülen komutu sonlandırır exec. İçinde \koştuğunuz kabuğun findkendi özel karakteri gibi davranmaması için değil, kendisine iletilmesi için kaçması gerekir find.

Daha fazla ayrıntı için bu makaleye bakın.


Ayrıca, findbazı optimizasyon sağlayan exec cmd {} +böyle çalıştırdığınızda, - findekler yerine (komut sadece bir kez, mümkünse çalıştırılan böylece) dosya başına bir kez çağırma daha komutun sonuna dosyaları bulundu.

Davranıştaki fark (verimlilikte değilse) ls, örneğin çalıştırıldığında kolayca fark edilir;

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

Bazı jpgdosyalarınız olduğunu varsayalım ( yeterince kısa yollarla ), sonuç ilk önce her dosya için bir satır ve lsdosyaların sonuncusu için sütunlarda gösterilmesinin standart davranışıdır.


1
Sana kontrast için daha faydalı olacağını düşünüyorum \;ile +.
Kevin,

Ne kadar farklı find . -name * | ls -a -?
András Hummer 11

@DrH Mesele, joker karakter genişletmesini kabuğun yapmasına izin vermek yerine joker karakter ifadesini iletmektir find. Ayrıca, lsbu durumda çıktı görünüşte girişe bağlı değildir - filtre olarak kullandığım ne olursa olsun find, lssadece çalışma dizini içeriğini görüntüler ve hepsi bu kadar. Örneğin kontrol find ~ -iname '*.jpg' -exec ls -a {} \;vs find ~ -iname '*.jpg' | ls -a.
moon.musick,

@DrH veya hatta echo 'foo' | ls -a.
moon.musick,

@ moon.musick, sana önemli kapalı kaçırdığınızı inanıyoruz -sizin de ls -a -test ederken neyi @ dr-h sorgulanan komuta.
Daniel Llewellyn

20

Gönderen için man findkomutuManpage simgesi :

-exec command ;
              Execute  command;  true if 0 status is returned.  All following arguments to find are taken to be arguments to
              the command until an argument consisting of `;' is encountered.  The string `{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  `\')  or
              quoted  to  protect them from expansion by the shell.

İşte açıklama:

{}"çıktısı" anlamına gelir find. "Her ne findbulmuşsa" gibi. findAradığınız dosyanın yolunu döndürür, değil mi? Yani {}onu değiştirir; findkomutun bulduğu her bir dosya için yer tutucu ( buradan alınacak ).

\;Bölüm temelde anlatıyor find"tamam ben yürütmek istediğini komutuyla Bitti".

Örnek:

Diyelim ki .txtdosya dolu bir dizindeyim. Sonra koşuyorum:

find . -name  '*.txt' -exec cat {} \;

İlk kısım, dosyaların find . -name *.txtbir listesini döndürür .txt. İkinci bölüm, -exec cat {} \;çalıştırır cattarafından bulunan her dosya için komut findböylece cat file1.txt, cat file2.txtvb.


4
Parça *.txtolarak alıntılanmalıdır '*.txt'. Bunun nedeni eğer .txtmevcut klasörde dosyalar varsa , kabuğun bunu genişletmesi ve yanlış sonuçlar veya bir hata mesajı almanızdır. find -name '*.txt' -exec cat {} \;
Paddy Landau

@Alaa Ali çok iyi açıkladı
pushya
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.