SORU
12 Temmuz 2009, Pazar


Çıkış yakalayan bulabilirsiniz . -print0 bash bir diziye

find . -print0 kullanarak boşluk, yeni satır, tırnak işaretleri vb dosya adlarını içeren olasılığı nedeniyle bash dosyaların bir listesini elde etmenin tek güvenli yol gibi görünüyor.

Ancak, zor bir zaman aslında bulmak çıktı diğer komut satırı yardımcı programları ile bash içinde ya da yararlı hale geçiriyorum. Çıkış kullanmayı başarmış tek yolu bu perl için boru ve perl null EĞERLER değiştirerek

find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'

Bu örnek ile ortaya çıkabilecek: dosya bulunamadı sayısı, dosya sayısı bozulmasını içinde yeni satır tehlikesini önleme yazdırır

find . | wc -l

En komut satırı programları desteklemez boş sınırlandırılmış girdi, sanırım en iyi şey olurdu yakalama çıktı find . -print0 Bir bash dizi gibi bitti perl Pasajı üstü, ve sonra devam ile görev, ne olursa olsun olabilir.

Bunu nasıl yapabilirim?

Bu çalışmıyor:

find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )

Çok daha genel bir soru olabilir:Nasıl bash dosyaları listeler ile yararlı bir şeyler yapabilir miyim?

CEVAP
13 Temmuz 2009, PAZARTESİ


Utanmadan Greg's BashFAQ çalıntı:

unset a i
while IFS= read -r -d $'\0' file; do
    a[i  ]="$file"        # or however you want to process each file
done < <(find /tmp -type f -print0)

Not yönlendirme inşa eskiden burada (cmd1 < <(cmd2)) benzer ama tamamıyla aynı değildir ve daha olağan boru hattı (cmd2 | cmd1) Bu komutlar kabuk yerleşiklere (örneğin while), boru hattı sürüm yürütür onlara uzaktır ve herhangi bir değişkenler kümesi (örneğin dizi a) kaybedince onlar çıkın. cmd1 < <(cmd2) dizi, inşaat, geçmiş hayatlarından sadece bir kabuk cmd2 çalışır. Uyarı: yeniden yönlendirme biçimini bash bile bash sh-öykünme modunda kullanılabilir; #!/bin/bash ile komut dosyasını başlatmak gerekir.

Ayrıca, çünkü dosya işleme adım (bu durumda, sadece a[i ]="$file" ama belki bir şey yapmak istemiyor meraklısı doğrudan döngü), giriş yönlendirildi, bunu kullanamazsınız herhangi bir komut bu olabilir okuma stdin. Bu sınırlama önlemek için kullanma eğilimindedir:

unset a i
while IFS= read -r -u3 -d $'\0' file; do
    a[i  ]="$file"        # or however you want to process each file
done 3< <(find /tmp -type f -print0)

...birim stdin yerine 3 üzerinden dosya listesini geçirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • optionalinfo

    optionalinfo

    29 EKİM 2005
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006