Bul -exec ls çıktısını sıralamak


14

find … -exec ls -ls ;Dosya adı ile alpabetli olarak sınıflandırılmış olabilir mi?

Bu benim cron komutum:

find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;

Bu komut çoğunlukla işe yarıyor. Ancak sonuçlar anlamlı bir sıraya göre sıralanmaz. Dosya adı alanına göre sıralanmaları çok yararlı olacaktır.


1
Zsh mı kullanıyorsunuz? ls -ls **/*(.)
Kevin

@Kevin Pek değil - sıralardı ls.
Gilles 'SO- kötü olmayı bırak

Yanıtlar:


14

Dosya adlarınızın yeni satır içermediğini varsayıyorum.

find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10

Eylemi sona erdirmek +yerine kullanmak , çağrılarını toplu hale ;getirerek -execdaha hızlı hale getirir ls. sortKomutu kullanarak boruları sıralayabilirsiniz ; 10. alanda sıralamaya başlamasını söyleyin (ilk 9 tanesi meta verilerdir: bloklar, izinler, bağlantı sayısı, kullanıcı, grup, boyut ve 3 tarih / saat alanı). Bu seçenek , kullanıcı ve grup için boşluk içeren kullanıcı veya grup adları riskini önleyen sayısal değerler kullanmayı -nsöyler ls.

Alternatif olarak, zsh ile , dosyaları toplamak ve sıralamak ve komut satırı çok uzunsa birden çok kez çalıştırmak için glob niteleyicileri kullanarak herhangi bir ad üzerinde hiçbir varsayım olmadan kurtulabilirsiniz . Yeniden sıralama yapmaktan kaçınmak için GNU'ya (özellikle onun seçeneğine) ihtiyacınız vardır (başka bir yaklaşım zsh'larla taklit etmek olacaktır ).zargslsls-flslszstat

autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf

Çok teşekkür ederim! Gönderdiğiniz ilk komutu kullanarak sıralama yapılır. Daha kısa bir yol kullanırsam sayı 10 olur mu? Örneğin, public_html yerine aynı komutu / home / setefgge'den çalıştırırsam?
MaJ

@MaJ 10, atlanan alanların sayısıdır, dosya adının boyutu ile ilgisi yoktur.
Gilles 'SO- kötü olmayı bırak'

Teşekkür ederim. Yardımınız ve ayrıca herkesin sağladığı yardım için teşekkür ederim. Bu sorunun çözüldüğünü düşünüyorum. Cron komutum dosyaları şimdi sıralıyor. Stackexchange'e ilk kez bir soru gönderdim. "Çözüldü" seçeneği görmüyorum. Herhangi biriniz bunu çözülmüş olarak nasıl yayınlayacağınızı biliyorsanız, lütfen devam edin ve yapın. Teşekkürler!
MaJ

@MaJ Bir soruyu çözülmüş olarak işaretlememiz gereken en yakın şey, cevaplardan birini kabul edilmiş olarak işaretlemektir. Bunu sadece sen, asker yapabilirsin. Bunu yapmak için, size en çok yardımcı olan cevabın yanındaki onay işaretini tıklayın. Bir yanıtı kabul ederseniz, 2 itibar puanı daha alırsınız ve bundan sonra yayınları oylayabilirsiniz. yararlı bulduğunuz tüm yayınları oylayabilirsiniz. Daha fazla bilgi için tur sayfasına ve birisi sorunuzu cevapladığında ne yapacağınıza ilişkin yardım sayfasına bakın .
Gilles 'SO- kötü olmayı bırak'

1

Neden sıralama yoluyla bulmanın sonucunu oluşturup her satır için ls yürütmüyorsunuz?

find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done

1

POSIX, bir ls -long listesindeki tarihler hakkında şunları söyler :

<date and time>Alan dosya son değiştirildiği zaman uygun tarih ve zaman damgası içerecektir. POSIX yerel ayarında, alan aşağıdaki tarih komutunun çıktısına eşdeğer olacaktır:

date "+%b %e %H:%M"

... dosya son altı ay içinde değiştirildiyse veya:

date "+%b %e %Y"

Bunu göz önünde bulundurarak ve bir dosya adında herhangi bir yeni satır varsa, POSIX tarafından belirtilen ls -qseçenekle düzgün bir şekilde globasyonlarının sağlanması, hiç lssonuç olmadan bir sonuç için normal ifade hazırlamak nispeten kolaydır find:

d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"

###OUTPUT###
Jul  5 Jul  4

grepbunun için yalnızca bugünün veya dünün tarihlerini temsil eden dizeleri içeren satırları döndürürsünüz. Aşağıdaki komut buna biraz ekler:

ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

ls seçenekler aşağıdakilerden oluşur:

  1. -a dizindeki tüm dosyaları döndürme - .dot
  2. -l uzun liste
  3. -R tüm alt dizinleri özyinelemeli olarak listeleme
  4. -c erişim zamanı yerine değişiklik zamanını görüntüle
  5. -qbir dosya adında ?yazdırılamayan veya \tab karakterleri yerine kabuk küresini döndürme

Bu sonuçlar yalnızca eşleşen |pipedosyaya aktarılır sed:

  1. Bir yol adından önceki boş satır ve aşağıdaki satır
  2. İle başlayan satırlar - (diğer bir deyişle - değil ddizin için) şu bilgileri de içerirler date.
  3. Ad verdikleri dizin gerçekten filtrelediğiniz dosyaları içermediği sürece yol adı satırlarını yazdırmaz.

Çıktı şöyle görünür:

ls -alRcq --color=always | 
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv   2086 Jul  4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv   2657 Jul  4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv    681 Jul  5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul  5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul  4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul  4 13:34 shot-2014-06-22_17-11-06.jpg

./.cache/efreet:
-rw------- 1 mikeserv mikeserv  37325 Jul  4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv  37325 Jul  4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  16037 Jul  4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv   3117 Jul  4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul  4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv  18589 Jul  4 23:30 icons_hicolor_localhost.eet

./.config:
-rw-r--r-- 1 mikeserv mikeserv   30 Jul  4 19:10 pavucontrol.ini

./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul  4 13:36 conf.tar.lz4.bak

Evet, hatta çalışıyor LS_COLORS- bu cronelbette sizin için düşük bir önceliktir , ancak hey seçenekleriniz açıktır.

Her durumda, bu, diğer bazı olası çözümlere göre bazı önemli avantajlar sunar.

  1. İlk olarak find+ lsbirden fazla çağrıyı içerir - bu sadece tek bir lssüreci içerir ve bu yüzden her şeyi - varsayılan olarak yaptığı - güvenilir bir şekilde sıralayabilir ve böylece sortyardımcı olur.

  2. Herhangi bir çözüm içeren findve sortve lshemen hemen yapıyor hepsi iki kere işin. lsve findher yol adını ve stather dosyayı çözecektir . lsve sorther ikisi de tüm sonuçları sıralayacaktır. Muhtemelen sadece single'ı kullanmak en iyisidir ls.

  3. Sonra elbette bu cevabın dateve sedbölümleri var . Burada dikkat edilmesi gereken önemli nokta, zor kısmı yapmanız ve önce regex'i elde etmenizdir - ve sadece bir kez - ve daha sonra, sonuçları almak, sonuçları almak, sonuçları sıralamak ve sonuçları sıralamak yerine yalnızca tek bir sonuç listesini budamanızdır.

  4. Bu, muhtemelen diğer çözümlerin de olacağı gibi, yeni satırlar içeren dosya adlarını bozmaz. Bu çözümün bir sonraki açıklayacağım kendi uyarıları var, ancak dakikalar ve kolayca ele alınabiliyorlar. Bence buradaki en sağlam çözüm.

Yukarıdaki komutun size sorunlara neden olabileceği iki durum vardır. Birincisi ?, dosya adlarındaki globları içerir - olduğu gibi burada sunulan diğerlerinden daha sağlam bir çözüm olduğu ve biriyle karşılaşma olasılığının ?tek başına yeterince küçük olmasına rağmen, bu globları çözme olasılığı vardır. birden fazla dosya adıyla eşleşebilir. Bakınız bu Bu konuda daha fazla bilgi için bkz.

Diğer olasılık yanlış bir pozitif içerir - örneğin, datearadığımız dizeyle gerçekten eşleşen bir dosya adınız varsa , grepancak o günlerin hiçbirinde değiştirilmemişse. Bunun bir sorun olduğuna güvenmiyorum, ama eğer öyleyse, sorun ve muhtemelen bunun üstesinden gelmek için normal ifadeyi daha belirgin hale getirmenize yardımcı olabilirim.


0

Aslında find, xargs ve ls birleşimlerini kullanabilirsiniz.

İşte örnek bir komut: find . -type f -print0 | xargs -0 ls -lt

  • find geçerli dizinin altındaki tüm dosyaları özyinelemeli olarak arayacaktır.
  • xargs bu dosya listesini lstek bir çağrıda komuta iletir (dosyalardan finddaha az döndürürse ARG_MAX).
  • ls -lt bu dosyaları zamana göre sıralar ve çıktıyı biçimlendirir

Sisteminizi almak için ARG_MAXaşağıdakileri yazabilirsiniz:

$ getconf ARG_MAX
> 2621440

-1
ls -l $(find /home/setefgge/public_html -type f -ctime -1 | sort)

1
lskendi sıralama yapar, bu yüzden findaracılığıyla çıkış borulama sortişe yaramaz. Ayrıca komutunuz boşluk içeren dosya adlarını (diğerleri arasında) yönetir ve çok fazla dosya adı varsa başarısız olur.
Gilles 'SO- kötü olmayı kes'
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.