![获取最新的目录(不是最新的文件)](https://linux22.com/image/38084/%E8%8E%B7%E5%8F%96%E6%9C%80%E6%96%B0%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%88%E4%B8%8D%E6%98%AF%E6%9C%80%E6%96%B0%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%89.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
答案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
- 日期对目录进行排序并输出最近修改的完整名称(即使包含一些空格作为剪切默认分隔符选项卡)