Çok sayıda XML dosyasını yeniden biçimlendirme


11

Yuvalanmış bir dizin yapısı dağılmış çok sayıda XML dosyaları manipüle ediyorum.

Aşağıdakileri denedim:

$ find . -name "*.xml" -type f | xargs -- xmllint --format

Sorun, biçimlendirilmiş XML çıktısını ekranda oluşturması ancak dosyayı değiştirmemesidir.

Gerçek dosya içeriği değiştirilecek şekilde bu komutu nasıl değiştirebilirim?

Yanıtlar:


23

Bu finddoğrudan aşağıdakiler kullanılarak yapılabilir -exec:

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

Ne geçirilen için -execşablon parametreleri ile bulunan dosya başına bir kere çağrılır {}geçerli dosya adı ile değiştirilmektedir. \;Find komutunun ucunda Şimdi çizgiyi sonlandırır.

Hem giriş hem de çıkış dosya adlarının aynı çağrıda belirtilmesi gerektiğinden, dosya kullanımı xargsgerçekten gerekli değildir çünkü xmllintdosya başına bir kez çağırmamız gerekir.

xargsbulmadan aktarılacak komut aynı anda birden çok dosya üzerinde çalışıyorsa ve bu liste uzunsa gerekli olurdu. Bu durumda bunu yapamazsınız, çünkü tek dosya adını --outputseçeneğine geçirmeniz gerekir xmllint. Olmadan xargs"çok uzun Argüman Listesi" a ile bitebileceğini hata dosyaların bir çok işlem eğer. xargsayrıca -Iseçeneği ile dosya değiştirme dizelerini destekler :

find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'

find -execYukarıdaki komutla aynı şeyi yapar . Klasörlerinizi herhangi bir boşluk gibi garip karakter varsa kullanmak gerekecektir -0seçenekleri findve xargs. Ama kullanarak xargsile -Iseçeneği ima -L 1siz de doğrudan kullanabilir, böylece araç sadece zaten bir seferde 1 dosyayı işlemek findile -exec.


@manatwork düzenlemeler için teşekkürler - yapışkan parmaklar; o)
didster

Ben sadece bu koştu ve bir tedavi gibi görünüyor! Hızlı ve özlü yanıt için çok teşekkürler!
Harry

2
“Dosya listesi çok büyükse bu başarısız olur”: Hayır, başarısız olmaz (her seferinde tek bir dosya işliyor) ve aslında find … -execbunu yapmanın en doğrudan yolu.
Gilles 'SO- kötü olmayı kes'

@Gilles İyi nokta! Cevabımı buna göre güncelledim.
didster

1
Bu, xmllintöncelikle tam xml belgesini belleğe yüklediği ve ancak daha sonra ayrıştırdığı / yazdığı için çalışır. Bu, belge yerinde işlemeye izin verir.
gavenkoa

6

Genellikle bu sorunlara dolaylı bir katmanla saldırırım. İstediğinizi yapan bir kabuk komut dosyası yazın ve bunu çağırın. Başlangıç ​​olarak öneririm

#! /bin/sh
for file
do
   xmllint --format $file > $file.tmp && mv $file.tmp $file
done

Bir dosyada veya iki elle elle deneyin, ardından xargs'de değiştirebilirsiniz

find . -name "*.xml" -type f | xargs -- xmltidy.sh

Gelecekte daha karmaşık manipülasyon yapmam gerekiyorsa bu iyi bir yaklaşım gibi görünüyor. Yanıtınız için teşekkürler.
Harry
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.