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


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可行,但是我想看看是否有更干净的解决方案。:)
丹尼尔(Daniel)

找 。-maxdepth 1型d | TZ = utc xargs ls -ld –全职| sort -k 6
ctrl-alt-delor 2014年

Answers:


24

尝试这个:

$ ls -td -- */ | head -n 1

-t选项ls按修改时间排序,最新的优先。

如果要删除/

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

1
如何摆脱斜线/
丹尼尔(Daniel)

如果您在另一个文件夹中,则无法使用。我的意思ls -td -- ./parent | head -n 1是没有给我正确的结果,我是否必须cd ./parent每次都使用subshel​​l 并执行此命令?有什么办法吗?
丹尼尔(Daniel)

@Daniel:您必须在当前工作目录中运行我的答案才能使其正常运行。否则,您必须使用相对路径,例如Herson的答案。
cuonglm

删除最后一个/无效。范例:/ home / cuo / bin /预期:/ home / cuo / bin
Marius

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

Herson解决方案的不同之处在于后面的斜杠*,使外壳程序忽略所有非目录文件。与Gnouc的不同之处在于,如果您在另一个文件夹中,它将起作用。

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

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

3

强制zsh答案:

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

括号中的字符是全限定符/仅匹配目录,om按年龄增长对匹配项进行排序,并且[1]仅保留第一个(即最新的)匹配项。N如果没有子目录,则要添加一个空数组(通常会得到一个1元素数组),请添加parent

另外,假设其中parent不包含任何shell globbing字符:

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 -仅将find命令限制为当前目录的直接子级
  • -type d -仅目录
  • -exec stat .. -从查找中输出修改的时间和目录名称,并用制表符(而不是空格)分隔
  • sort -n -r |head -1 | cut -f2 -日期对目录进行排序,并输出最近修改的全名(即使包含某些空格作为默认的“分隔符”标签也是如此)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.