`Ls -l` çıktısından bir alanı / sütunu nasıl seçerim?


22

Hedefim aldatıcı bir şekilde basittir (en azından benim için). Çıktısını almak ls -lveya ls -lhsadece bir alan seçmek istiyorum.

Bunun mümkün olduğu kadar kurşun geçirmez olmasını istiyorum, demek istediğim, dosya adlarının alandaki her şeyin aynı uzunluğa sahip olmadığını, değişken bir sayıya sahip olabileceğini varsayalım.

Alanın adını alacak bir komut dosyasına sahip olmak için bonus puan (veya yalnızca bir alan numarası) ve ardından alanın içeriğini döndürür.

Açmak istiyorum

görüntü tanımını buraya girin

içine:

görüntü tanımını buraya girin

Yanıtlar:


41

Dene ls -l | awk '{print $7}'.

awk sütunları seçtiği için bu görev için mükemmel.


3
@Ormaaj tarafından açıklandığı gibi: ile belirli yerlerde mevcut olan bilgi parçalarına güvenmeyin ls. findKomut müthiş yararlıdır.
Paddy Landau

@PaddyLandau Bulunduğum gibi megabayt olarak dosya boyutunu yazdırmak için find komutunu nasıl kullanırım ls -l --block-size=M?
SurpriseDog

@Benjamin - lsKomut POSIX standardı değildir, bu nedenle bağımlı olan bir komut dosyası lsfarklı sistemlerde ve hatta zaman içinde bozulabilir. Daha fazla bilgi için bu sayfadaki @ormaaj tarafından verilen cevaba bakınız. İstediğin şeyi yapmanın bir yolu, bir Bash döngüsü ile. İşte bir örnek. for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done. Tabii ki, yerine echoişleminizi kullanırsınız.
Paddy Landau

@PaddyLandau İşe yarayan find komutunun çıktısını kendim de verdim ... | xargs -d '\n' du -m.
SurpriseDog

@ Benjamin -execseçeneğine bakmak isteyebilirsiniz find.
Paddy Landau

17

Asla ayrıştırma . GNU’yu kullanın find. Ya da taşınabilirlik önemli değilse stat(1),.

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

Satır satır dosya listesi listeleri ve alanlara ayrılması dışındaki verileri okumak için, bakınız: BashFAQ / 001

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


1

Belirli sütunu aşağıdaki gibi bir kabuk içinde alabilirsiniz:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

ya awkda @Corey cevabında gösterildiği gibi, ayarlandıktancut -c44-45 sonra da ( lssabit sütunlara sahip olduğundan) ya da her neyse , aynı zamanda çalışacaktı , ancak asıl sorun, güvenilir ve kurşun geçirmez olmayacağıdır (örneğin, Unix'de olabilir $6, olabilir $7ve Argümanlara bağlı olarak değişir) makineyle dost değildir,ls bu nedenle komutu tamamen çözümlemeniz önerilmez .

En iyisi, çıktıyı istediğiniz gibi biçimlendirmek için ilgili seçenekler sunabilen findveya gibi farklı kullanılabilir komutları kullanmaktır stat. Ö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 günlerinin sütununu döndürmek için şu örneği deneyin:

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

GNU’nun statBSD’ye göre farklı seçeneklerinin olabileceğine dikkat çekiyor stat, bu yüzden farklı işletim sistemlerinde hala kurşun geçirmez olmayacak.


1
+ 1 'in kullanımı kadar iyi ayrıştırılmaması gerektiğinden de bahsedilir stat. dateancak kurulum yanlış. Eklemelisiniz --date=$ymd, çünkü datekendiliğinden o anki günü yazdırabilir, ancak buradaki amaç dosyanın tarih biçimini dönüştürmektir
Sergiy Kolodyazhnyy

ls -la | cut -c32-33O kullanıcı adları uzunluğu ve dosyaları üzerinde üzerinde büyüklüğüne bağlıdır çünkü toplam dürüstlük komut çünkü sadece dosya adlarına sahip olası tuzaklardan, sadece tamamen güvenilmez olmakla basitçe. stat -c "%x" *.*Komut Tamam görünüyor, ama kullanarak *.*sadece bir nokta içeren dosya isimleri onu kısıtlar ediyoruz. Sanırım amaç gizli dosyaları da yakalamaktı; bu durumda önceden dotfiles için globbing imkan vermelidir ve kullanımı *yerine *.*: shopt -s dotglob; stat -c "%x" * | [...].
kos

Ah ve Serg'in de söylediği gibi --date="$ymd", datekomuta eklemelisin , aksi takdirde ayın o gününü basar.
kos

Yorumlarınız için teşekkürler. Sorunları ele aldım ve daha iyi bir ilk örnek verdim.
kenorb
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.