'ls -l' çıktısından nasıl bir alan / sütun seçerim?

17

Amacım aldatıcı derecede basit (en azından benim için). % Co_de% veya ls -l çıktısını almak ve sadece bir alan seçmek istiyorum.

Mümkün olduğu kadar kurşun geçirmez olmak için arıyorum, bu demek istediğim, dosya adlarının, alandaki her şeyin değil, değişken alan sayısına sahip olabileceğini varsayalım.

Alan adını (veya sadece bir alan numarası) alacak ve daha sonra alanın içeriğini döndürecek bir betiğe sahip olmak için bonus puanları.

Dönüşmek istiyorum

içine:

    
sordu soandos 10.07.2012 03:00

3 cevap

34

ls -l | awk '{print }' ’yi deneyin.

awk bu görevi mükemmel hale getirecek şekilde sütunları seçer.

    
verilen cevap Corey Whitaker 10.07.2012 03:04
16

Hiçbir zaman ayrılmayın . GNU find kullanın. Veya taşınabilirlik önemli değilse, stat(1) .

find . -maxdepth 1 -printf '%Td\n'

Dosya adlarının listesi dışındaki satırlardaki verileri okumak ve alanlara ayırmak için bkz. BashFAQ / 001

Çoğu durumda mantıklı olan dosya adlarının sınırlandırılmış yeni bir listesini güvenilir bir şekilde okumak için hiçbir yöntem yoktur.

    
verilen cevap ormaaj 10.07.2012 03:15
1

Belirli bir sütunu aşağıdaki gibi kabukta getirebilirsiniz:

ls -al | while read perm bsize user group size month day time file; do echo $day; done
@Corey answer 'de gösterildiği gibi

​​veya awk , cut -c44-45 ayarlandıktan sonra da çalışır (% co_de olduğundan % 'si sabit sütunlara sahiptir), ya da başka herhangi bir şey, ancak asıl sorun, güvenilir ve kurşun geçirmez olmayacak olmasıdır (örneğin, Unix üzerinde ls , olmayabilir, ve argümanlara bağlı olarak değişir) Bu nedenle, makine dostu olarak komutunu ayrıştırmanız önerilmez.

En iyisi, ls veya find gibi farklı kullanılabilir komutları kullanmaktır; bu, çıktıyı gereksinim duyduğunuz şekilde biçimlendirmek için ilgili seçenekler sağlayabilir. Örneğin:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

Yalnızca değişiklik yapılan günlerin sütununu döndürmek için şu örneği deneyin:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

% cod stat BSD stat için farklı seçeneklere sahip olabileceğine dikkat etmeliyiz, bu yüzden farklı işletim sistemlerinde hala kurşun geçirmez olmayacaktır.

    
verilen cevap kenorb 10.04.2016 06:27

Etiketlerdeki diğer soruları oku