Получить последний каталог (не последний файл)


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-type d | TZ = utc xargs ls -ld --full-time | 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 , это будет работать, если вы находитесь в другой папке.

Cut необходимо знать количество родительских каталогов (2), чтобы удалить завершающий символ '/'. Если у вас этого нет, используйте

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

3

Обязательный зш ответ:

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 - ограничить команду поиска только непосредственными дочерними элементами текущего каталога
  • -type d - только каталоги
  • -exec stat .. - выводит измененное время и имя каталога из find, разделенные табуляцией (а не пробелом)
  • sort -n -r |head -1 | cut -f2 - date упорядочивает каталог и выводит полное имя самого последнего изменения (даже если оно содержит пробел в качестве разделительной вкладки по умолчанию)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.