Отримайте найновіший каталог (не останній файл)


15

Моя папка parentмає такий вміст:

A.Folder B.Folder C.File

У ній є як папки, так і файли. B.Folderновіший. Тепер я просто хочу отримати B.Folder, як я міг цього досягти? Я спробував це,

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

але це дає мені drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder, але мені просто потрібно ім'я B.Folder.


1
скористайтеся цимls -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

Використання awk працює, але я хочу перевірити, чи є чистіше рішення. :)
Даніель

знайти. -maxdepth 1 -тип d | TZ = utc xargs ls -ld - повний час | sort -k 6
ctrl-alt-delor

Відповіді:


24

Спробуйте це:

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

-tПараметри роблять lsсортування за часом модифікації, найновішим спочатку.

Якщо ви хочете видалити /:

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

1
Як позбутися від косого /?
Даніель

Це не працює, якщо ви перебуваєте в іншій папці. Я маю на увазі, ls -td -- ./parent | head -n 1що не дає мені правильних результатів, чи маю я використовувати підзаголовок, як cd ./parentщоразу, і виконувати цю команду? Будь-яке рішення?
Даніель

@Daniel: Ви повинні запустити мою відповідь у поточному робочому каталозі, щоб вона працювала. В іншому випадку ви повинні використовувати відносний шлях, як відповідь Херсона.
cuonglm

Видалення останнього / не працює. Приклад: / home / cuo / bin / Очікується: / home / cuo / bin
Marius

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

Відмінність рішення Херсона полягає в прорізі після *, завдяки якому оболонка ігнорує всі файли, що не містять dir. Відмінність від Gnouc , вона працюватиме, якщо ви знаходитесь в іншій папці.

Вирізати потрібно знати кількість батьківських каталогів (2), щоб видалити останнє '/'. Якщо у вас цього немає, використовуйте

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

3

Обов’язковий відповідь zsh:

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

Символи в дужках є глобальними класифікаторами : /порівнювати лише каталоги, omсортувати збіги за збільшенням віку та[1] зберігати лише перший (тобто найновіший) збіг. Додайте, Nякщо ви хочете отримати порожній масив (зазвичай ви отримуєте 1-елементний масив), якщо немає підкаталогу parent.

Крім того, якщо припустити, що parentвін не містить жодного символу , що складається з оболонки:

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

Якщо у вас немає zsh, але у вас є останні інструменти GNU (тобто невбудований Linux або Cygwin), ви можете використовувати find, але це громіздко. Ось один із способів:

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

Існує просте рішення ls, яке працює до тих пір, поки жодне ім'я каталогу не містить нових рядків або (у деяких системах) символів, які не можна друкувати:

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


2

Наступна команда зробить роботу навіть у випадку, якщо ім'я каталогу містить пробіл:

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

Оновлене пояснення матеріалів на задніх полях:

  • . - поточний каталог (ви можете тут вказати абсолютний шлях)
  • -mindepth/-maxdepth - обмежте команду find лише безпосередніми дітьми поточного каталогу
  • -type d - лише каталоги
  • -exec stat .. - виводить модифікований час та ім'я каталогу із знаходження, розділеного вкладкою (а не пробілом)
  • sort -n -r |head -1 | cut -f2 - дата упорядковує каталог і виводить повне ім’я останнього зміненого (навіть якщо містить деякий пробіл як вирізаний за замовчуванням роздільник обмежувача)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.