Kabuk betiğindeki döngüler, find ve xargs dahil olmak üzere bunu yapmanın birkaç yolu vardır. Bunlardan hangisi en iyi hangisi en taşınabilir?
Kabuk betiğindeki döngüler, find ve xargs dahil olmak üzere bunu yapmanın birkaç yolu vardır. Bunlardan hangisi en iyi hangisi en taşınabilir?
Yanıtlar:
find . -exec <command> {} \;
geçerli dizin için ağacın kökü olarak veya genel olarak:
find <directory> -exec <command> {} \;
-name "*.c"
veya örneğin -type d
dizinler için ...
find ... | xargs ...
deyimi kullanın, dosyaları toplu olarak işler ve bu genellikle daha hızlı olur (daha az işlem başlatılır).
Bulma -print0
seçeneğini ve boşluklu dosya veya dizin adlarınız varsa -0
seçeneğini kullanın xargs
:
find {dir} -print0 | xargs -0r {command}
-print0
Bir şekilde opsiyon dosya adları dışarı baskılar bulmak için NUL
-separated ziyade boşluk daha ayrılmış listesi ise -0
seçeneği xargs
talimatını o onun girişini kırmak için NUL
değil, boşluk daha. Yana NUL
Unix dosya adlarında izin verilmez karakterlerden biridir, bir dosya adı parçası için yanlış olması için hiçbir yol yoktur.
-r
Seçenek yoktur böylece xargs
hiçbir girişi varsa size bir hata vermeyecektir.
Taşınabilirlik bir sorunsa, kabuğa özgü yollardan uzak dururdum (birçok farklı kabuk kullanan birçok insan var, ancak genel olarak bul ve xargs, kimsenin radikal bir şekilde değişmeye cesaret edemeyeceği gerçekten temel araçlardır) .
Find ve xargs temel argümanlarını kullanmak size daha taşınabilir bir çözüm sunmalıdır.
Bağımsız değişkenleri birlikte gruplamak kabul edilebilir durumdaysa, | xargs, komutu -exec dosyasını bulmaktan çok daha az kez yürüteceği için muhtemelen daha iyi performans verecektir. Komutu her dosya için her seferinde yürütmek veya dosyanın alt dizininde yürütmek istiyorsanız, find -exec veya -execdir komutlarını kullanmalısınız.
Kural olarak, kabuğa özgü döngülerden uzak durmak tercih edilir; find & xargs çoğu senaryo için yeterlidir.
Kullandığınız komut sürümünün, özyinelemeli işlem için zaten bir bayrağı olmadığından emin olun. :)