Xargs'ı find sonuçları üzerinde kullanırken dosya adlarındaki boşlukları nasıl kullanabilirim?


28

Yaygın uygulamalarımdan biri, belirli bir türdeki tüm dosyalar üzerinde greps yapmaktır; örneğin, içinde "rumpus" kelimesini içeren tüm HTML dosyalarını bulmaktır. Bunu yapmak için kullanıyorum

find /path/to -name "*.html" | xargs grep -l "rumpus"

Bazen, findadında boşluk olan bir dosya döndürür my new file.html. Ne zaman xargsbu geçirilen grep, ancak, bu hataları alıyorum:

grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory

Burada neler olup bittiğini görebiliyorum: ya boru ya xargsda boşluklar dosyalar arasındaki sınırlayıcılar gibi davranıyor. Hayatım boyunca, bu davranışı nasıl önleyeceğimi bilemiyorum. find+ İle yapılabilir xargsmi? Yoksa tamamen farklı bir komut kullanmalı mıyım?

Yanıtlar:


29

kullanım

find ... -print0 | xargs -0 ...

Örneğin

find /path/to -name "*.html"  -print0 | xargs -0  grep -l "rumpus"

man bul sayfasından

-print0
          True; print the full file name on the standard  output,  followed
          by  a  null  character  (instead  of  the  newline character that
          ‘-print’ uses).  This allows file names that contain newlines  or
          other  types  of  white space to be correctly interpreted by pro-
          grams that process the find output.  This option  corresponds  to
          the ‘-0’ option of xargs.

15

Xargs kullanmanıza gerek yoktur , çünkü find komutları kendisi çalıştırabilir. Bunu yaparken, isimdeki karakterlerin kabuk yorumlanması konusunda endişelenmenize gerek yok.

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

man bul sayfasından

-exec komut {} +
-exec eyleminin bu değişkeni, seçilen dosyalara belirtilen komutu çalıştırır, ancak komut satırı, seçilen her dosya adını sonuna ekleyerek oluşturulur; Komutun toplam çağrı sayısı eşleşen dosya sayısından çok daha az olacaktır. Komut satırı, xargs'ın komut satırlarını oluşturduğu şekilde oluşturulur. Komut içerisinde yalnızca bir {}} örneğine izin verilir. Komut başlangıç ​​dizininde yürütülür.


Bunu affederdim ama bugün için hiç hakkım kalmadı - yarın yaparım.
user9517, 10:11

1
@Iain - oraya gitmek (bu arada, katılıyorum).
Eduardo Ivanec

Sadece kullanarak Xargs'ın özelliklerini hala kaçırıyorsunuz, artı aptalca alıntı kuralları ile uğraşmak zorundasınız. Birden fazla çekirdeğiniz / CPU'nuz varsa, xargs -P argümanına bakın.
Slartibartfast

8

Sisteminizdeki find ve xarg sürümleri desteklemiyorsa -print0ve bunları -0değiştiriyorsa (örneğin, AIX bulma ve xargs) şunları kullanabilirsiniz:

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

Burada sed, xargs için yerlerden kaçmakla ilgilenir.


Bu bana yardımcı oldu çünkü uzun zamandır kullandığım ve oluşturması zor olan dosya isimlerinin listesi vardı. findHepsini bir daha gidemem .
Scott M.
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.