我想找到具有特定模式的文件并打印与完整路径匹配的模式的最新文件
find ../*.gz -type f -print0 | sort -nr | cut -d: -f2- | head -n 1
如何打印相同的完整路径。
应用户要求ls -l
:
ls -l
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:29 fa1caae85
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:28 ga1c93eda
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:28 la1cbbh05
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:08 node_modules
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:08 _tasks
所有前三个文件夹都包含需要的.gz
文件,但是我想.gz
从中获取最新的文件。
答案1
非正统方法:
zsh -c 'print -r $PWD/**/*.gz(.om[1])'
在哪里
()
after*.gz
意味着使用所谓的 glob 限定符,即:.
仅考虑纯文件om
按修改时间排序[1]
只取第一个元素- 添加
D
限定符以同时考虑隐藏的 gz 文件(就像这样find
做)。
显然,如果您已经在使用 zsh,则不需要使用 来调用它zsh -c
。
答案2
您可以使用此命令来做到这一点,
find "$(pwd)" -type f -name "*.gz" -printf "%T@ %p\n"| sort -rn | cut -d' ' -f 2- | head -n 1
假设 GNUfind
路径名不包含换行符并且文件名在语言环境中是有效文本。要处理换行符和非字符,您可以将其更改为:
(
export LC_ALL=C
find "$PWD" -type f -name '*.gz' -printf '%T@\t%p\0' |
sort -zrn | head -zn 1 | cut -zf 2- | tr '\0' '\n'
)
假设 GNU 实用程序的版本相对较新。即使用 NUL 分隔记录而不是行(换行分隔记录),因为 NUL 是文件路径中唯一不能出现的字符。
我们通过使用变量(包含 POSIX shell 中当前工作目录的路径)来避免命令替换 ( $(pwd)
),它会去除尾随换行符。$PWD
将语言环境切换到C
(此处在本地子 shell 环境中(...)
)可确保每个字节始终被视为一个字符(一般来说,它还简化了排序和文本处理)。
答案3
这对我来说效果很好:
ls -t ../*.gz | head -n1
从man ls
:
-t sort by modification time, newest first