En son dizini al (en son dosyayı değil)


15

Klasörüm parentşu içeriğe sahip:

A.Folder B.Folder C.File

İçinde hem klasörler hem de dosyalar var. B.Folderdaha yeni. Şimdi sadece elde etmek istiyorum B.Folder, bunu nasıl başarabilirim? Bunu denedim,

ls -ltr ./parent | grep '^d' | tail -1

ama bana veriyor drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, ama sadece isme ihtiyacım var B.Folder.


1
bunu kullanls -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

Awk kullanmak işe yarar, ama daha temiz bir çözüm olup olmadığını görmek istiyorum. :)
Daniel

bulmak. -maxdepth 1-tipi d | TZ = utc xargs ls -ld --full-time | sıralama -k 6
ctrl-alt-delor

Yanıtlar:


24

Bunu dene:

$ ls -td -- */ | head -n 1

-tseçenekler lsdeğişiklik zamanına göre sıralama yapar , en yenisi.

Kaldırmak istiyorsanız /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

1
Eğik çizgiden nasıl kurtuluruz /?
Daniel

Başka bir klasördeyseniz bu çalışmaz. Demek istediğim ls -td -- ./parent | head -n 1bana doğru sonuçları vermiyor, cd ./parenther seferinde olduğu gibi alt kabuğu kullanmak ve bu komutu yürütmek zorunda mıyım ? Herhangi bir çözüm?
Daniel

@Daniel: Çalışması için cevabımı geçerli çalışma dizininde çalıştırmalısınız. Aksi takdirde, Herson'ın cevabı gibi göreli bir yol kullanmalısınız.
cuonglm

Son kaldırma / çalışmıyor. Örnek: / home / cuo / bin / Beklenen: / home / cuo / bin
Marius

5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Herson'ın çözümünün farkı *, kabuğun tüm direk olmayan dosyaları yoksaymasını sağlayan eğik çizgi . İçin Fark Gnouc başka klasörde ise, bu ödeme şekli.

Cut, sondaki '/' karakterini silmek için ana dizin sayısını (2) bilmelidir. Eğer buna sahip değilseniz,

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

3

Zorunlu zsh cevabı:

latest_directory=(parent/*(/om[1]))

Parantez içindeki karakterler glob niteleyicileridir : /yalnızca dizinleri eşleştirmek, omyaşları artırarak eşleşmeleri sıralamak ve [1]yalnızca ilk (yani en yeni) eşleşmeyi korumak. Ekle NBoş bir dizi almak istiyorsanız hiçbir alt dizin varsa (normalde 1-elementy dizisi olsun) parent.

Alternatif olarak, parentherhangi bir kabuk globbing karakteri içermediğini varsayarsak :

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

Zsh'iniz yoksa ancak son zamanlarda GNU araçlarınız varsa (yani gömülü olmayan Linux veya Cygwin) kullanabilirsiniz find, ancak kullanışsızdır. İşte bir yol:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

lsHiçbir dizin adı yeni satır içermediği veya (bazı sistemlerde) yazdırılamayan karakterler içermediği sürece çalışan basit bir çözüm vardır :

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}


2

Aşağıdaki komut, boşluk içeren dizin adı durumunda bile işi yapar:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

Backticks'teki şeylerin güncellenmiş açıklaması:

  • . - geçerli dizin (burada mutlak bir yol belirtmek isteyebilirsiniz)
  • -mindepth/-maxdepth - find komutunu yalnızca geçerli dizinin hemen alt çocuklarıyla sınırla
  • -type d - sadece dizinler
  • -exec stat .. - değiştirilen zamanı ve dizinin adını bir sekmeyle ayrılmış bir boşlukla değil, bir boşlukla çıkarır
  • sort -n -r |head -1 | cut -f2 - date dizini sipariş eder ve en son değiştirilenin tüm adını verir (varsayılan sınırlayıcı sekmesi olarak boşluk bıraksa bile)
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.