Dapatkan direktori terbaru (bukan file terbaru)

15

Folder saya parentmemiliki konten berikut:

A.Folder B.Folder C.File

Ini memiliki folder dan file di dalamnya. B.Folderlebih baru. Sekarang saya hanya ingin mendapatkan B.Folder, bagaimana saya bisa mencapai ini? Saya mencoba ini,

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

tapi itu memberiku drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, tapi aku hanya butuh namanya B.Folder.

Daniel
sumber
1
gunakan inils -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا
Menggunakan awk berfungsi, tetapi saya ingin melihat apakah ada solusi yang lebih bersih. :)
Daniel
Temukan . -maxdepth 1 -type d | TZ = utc xargs ls -ld --full-time | sort -k 6
ctrl-alt-delor

Jawaban:

24

Coba ini:

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

-topsi buat lsurutkan berdasarkan waktu modifikasi, terbaru terlebih dahulu.

Jika Anda ingin menghapus /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
cuonglm
sumber
1
Bagaimana cara menyingkirkan tebasan /?
Daniel
Ini tidak berfungsi jika Anda berada di folder lain. Maksud saya ls -td -- ./parent | head -n 1tidak memberi saya hasil yang benar, apakah saya HARUS menggunakan subshell seperti cd ./parentsetiap kali dan menjalankan perintah ini? Ada solusi?
Daniel
@Aniel: Anda harus menjalankan jawaban saya di direktori kerja saat ini untuk membuatnya berfungsi. Jika tidak, Anda harus menggunakan jalur relatif seperti jawaban Herson.
cuonglm
Menghapus yang terakhir / tidak berfungsi. Contoh: / home / cuo / bin / Diharapkan: / home / cuo / bin
Marius
5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Perbedaan solusi Herson adalah slash after *, yang membuat shell mengabaikan semua file non-dir. Perbedaan ke Gnouc , itu akan berfungsi jika Anda berada di folder lain.

Cut perlu mengetahui jumlah direktori induk (2) untuk menghapus trailing '/'. Jika Anda tidak memilikinya, gunakan

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

Wajib jawab zsh:

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

Karakter dalam tanda kurung adalah kualifikasi global : /untuk mencocokkan hanya direktori, ommengurutkan pertandingan dengan bertambahnya usia, dan [1]untuk mempertahankan hanya pertandingan pertama (yaitu yang terbaru). Tambahkan Njika Anda ingin mendapatkan array kosong (biasanya Anda mendapatkan array 1-elemen) jika tidak ada subdirektori dari parent.

Atau, dengan asumsi parenttidak mengandung karakter globbing shell:

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

Jika Anda tidak memiliki zsh tetapi Anda memiliki alat GNU baru-baru ini (yaitu, Linux atau Cygwin yang tidak tertanam), Anda dapat menggunakan find, tetapi ini rumit. Ini salah satu caranya:

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")

Ada solusi sederhana ls, yang berfungsi selama tidak ada nama direktori yang mengandung baris baru atau (pada beberapa sistem) karakter yang tidak dapat dicetak:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}
Gilles 'SO- berhenti menjadi jahat'
sumber
2

Anda dapat melakukan:

ls -td -- ../parent/* | head -n 1
Anaknya
sumber
Ini memberikan file terbaru. Daniel hanya menginginkan direktori.
Gilles 'SO- berhenti bersikap jahat'
2

Perintah berikut akan melakukan pekerjaan bahkan dalam kasus nama direktori yang mengandung ruang:

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

Penjelasan yang diperbarui dari hal-hal di backticks adalah:

  • . - direktori saat ini (Anda mungkin ingin menentukan jalur absolut di sini)
  • -mindepth/-maxdepth - Batasi perintah find hanya untuk anak-anak langsung dari direktori saat ini
  • -type d - hanya direktori
  • -exec stat .. - Output waktu yang dimodifikasi dan nama direktori dari find dipisahkan dengan tab (dan bukan spasi)
  • sort -n -r |head -1 | cut -f2 - date memerintahkan direktori dan menampilkan seluruh nama yang paling baru-baru ini dimodifikasi (bahkan jika mengandung beberapa ruang sebagai tab pembatas default cut)
c-tools
sumber