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

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

Моя папка 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 -td -- */ | head -n 1

-tпараметры lsсортировки по времени изменения, сначала новые.

Если вы хотите удалить /:

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

решение2

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

Разница вРешение Херсонаэто слеш после *, который заставляет оболочку игнорировать все файлы, не относящиеся к каталогу. Разница сГноук, это сработает, если вы находитесь в другой папке.

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

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

решение3

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

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

Символы в скобках:квалификаторы glob: /для сопоставления только каталогов, 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%/}

решение4

Следующая команда выполнит работу даже в том случае, если имя каталога содержит пробел:

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 упорядочивает каталог и выводит полное имя последнего измененного файла (даже если оно содержит пробелы, так как разделитель по умолчанию - табуляция)

Связанный контент