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