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.


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

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

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%/}


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.