获取最新的目录(不是最新的文件)

获取最新的目录(不是最新的文件)

我的文件夹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

区别于赫森的解决方案是后面的斜杠*,它使 shell 忽略所有非 dir 文件。区别于格努克,如果您在另一个文件夹中,它会起作用。

Cut 需要知道父目录的数量 (2) 才能删除尾随的“/”。如果你没有这个,请使用

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

答案3

zsh 强制回答:

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

括号中的字符是全局限定符/仅匹配目录,om按年龄增长对匹配项进行排序,并[1]仅保留第一个(即最新的)匹配项。如果N没有.parent

或者,假设parent不包含任何 shell 通配符:

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- 将 find 命令仅限于当前目录的直接子目录
  • -type d- 仅目录
  • -exec stat ..- 输出修改时间和目录名称,以制表符(而不是空格)分隔
  • sort -n -r |head -1 | cut -f2- 日期对目录进行排序并输出最近修改的完整名称(即使包含一些空格作为剪切默认分隔符选项卡)

相关内容