2016-03-28 17 views
1

için boş alanların bilinmeyen miktarını değiştirme Ben bir linux komut dosyası yazıyorum ve ilginç bir bulguya geldim.X miktarı

Dizinde dosyaları dizine göre sıralayacak ve en büyük olanını yazdıracak bir komutum var.

find . -type f -ls | sort -r -n -k7 | head -n 1

şöyle komutu Bu yüzden yalnız büyük dosya boyutunu almak ve yazdırmak istediğiniz

895918591 8 -r-w-x 1 user01 xdf 1931 28 march 23:21 ./myscript.sh

gibilerin arasında bir şey yazdırır olduğunu. Ayırmak için cut -d' ' -f2 numarasını kullandım, bu sadece boş çıktılar. Çünkü boşluk miktarı tutarsızdır.

Yani bu tüm boş alanlar şimdi ortak ayırıcı onları ayıramam kaldırır, bu

find . -type f -ls | sort -r -n -k7 | head -n 1 | tr -d [:blank:] | cut -d' ' -f2

Issue gibi bir şey yapıyor çalıştı. Yani ben soruyorum, tüm boş alanları gerçekten değiştirmenin ve sonra bunları tek bir boşlukla değiştirmenin bir yolu var mı?

Değilse, bu bayt sayısına ulaşmanın başka bir yolu yok mu? Yerine kesim kullanmanın

+1

,' 'sed kullanmak s/\ s \ + ile birden beyaz alanlara herhangi oluşumunu değiştirmek için// g'' bir boşluk. İsteğe bağlı olarak, '/ \ s \ + /:/g' karakterini kolon ile değiştirir. 'Wc -c' kullanarak –

cevap

0

, size

find . -type f -ls | sort -r -n -k7 | head -n 1 -printf %s 
1

yerine cut kullanabilirsiniz ekranınıza üzerinde kontrol sağlıyor Printf komutunu kullanarak deneyebilirsiniz awk:

find . -type f -ls | sort -r -n -k7 | head -n 1 | awk '{print $2}' 

bile önleyebilirsiniz Ancak head'un yanı sıra awk:

1

Sed ve Awk bu tür şeyler için harika araçlardır. Sed, Sed programının aldığı her satırın içeriğini değiştiren, regex tabanlı bir dildir ve Awk, girdiyi otomatik olarak alanlara bölen bir çizgi yönelimli araçtır.

SED bir boş ( ile /\s+/ yerine geçen tüm maçları) içine işlenmemiş sekanslarını açmak için:

$ find ... | sed 's/\s+/ /g' 

sadece AWK her satırın ilk "kelimesi" (nonspaces dizisi) yazdırmak için:

$ find ... | awk '{print $1}' 

http://tldp.org/LDP/abs/html/sedawk.html bu dillerden ile başladı alabilirsiniz.

0

Yanlış yapıyorsunuz.

ls'u herhangi bir biçimde ayrıştırma (find 's -ls isteğe bağlı), kötü bir yaklaşımdır.

Hiçbir şey için ls çıkış kullanmayın. ls, dizin meta verilerine etkileşimli olarak bakmak için kullanılan bir araçtır. Kod ile ls çıktısını ayırma girişimleri bozuk.

Bu konu hakkında daha fazla bilgi almanızı şiddetle öneririm. Oku Parsing ls.


Bunun yerine, aşağıdaki işlevi kullanın:

# Usage: largest [dir] 
largest() { 
    local f size largest 

    while read -rd '' f; do 
     size=$(wc -c < "$f") 
     if ((size > largest[0])); then 
      largest=("$size" "$f") 
     fi 
    done < <(find "${1-.}" -type f -print0) 

    printf '%s is the largest file in %s\n' "${largest[1]}" "${1-.}" 
} 
+0

dosya boyutunu bulmak için oldukça pahalı bir yol gibi görünüyor. Stat hakkında ne dersiniz? Hepinize iyi şanslar. – shellter

1

birden boşluk dönüştürmek için bir araçtır sadece bir tr -s denir için:

sıkar çevirir

Örnek:

$ cat a 
hello this is  a sample text with  multiple spaces 
$ tr -s " " < a 
hello this is a sample text with multiple spaces 

sonra X içine her boşluk, sed 's// /g' sadece boruyu dönüştürmek istiyorsanız.

1

Ben eldeki sorunu overthinking düşünüyorum:

yerine tr` `arasında
find -type f -printf "%s\n"|sort -n|tail -n1 
İlgili konular