我有一个对我有效的命令,它将在当前目录中找到与模式匹配的零个或一个目录:
find . -maxdepth 1 -type d -name 'suman-*'| head -n1
在MacOS上,这将导致如下结果:
./suman-1479860474833
<!EDIT>
我的目标是找到最近的目录(带有最近的时间戳)。目录内容如下:
foo
bar
baz
suman-1479860475524
suman-1479860471431
suman-1479860474233
...
etc.
</EDIT>
我有三个问题,
使用BASH,如果结果存在,那么如何删除
./
字符?他们应该一直在那里,但我想总是把前两个字符可能太模糊了。
使用bash,而不是用
head
找到第一个结果,找到最后一个结果的最佳方法是什么?我猜是tail
但也许有是个更好的方法。
有没有办法只与一个数字匹配而不只是使用
'suman-*'
?也许我应该用-regex
而不是-name
?现在,我可以按目录名中的时间戳对目录进行排序,也可以潜在地按它们的元数据进行排序(如果元数据是准确的并且通过版本控制更新等持续存在)。我个人不确定目录元数据是否足够持久,所以我想应该更透明,并在目录名中使用时间戳。而且看起来在Unix中没有创建目录的时间=>“在Unix中,创建时间没有存储(仅:访问、修改和更改)。”
最佳答案
使用GNUfind
,如果您不想./
,您可以简单地避免告诉find
打印它。
# with GNU find
find . -maxdepth 1 -type d -name 'suman-*' -printf '%P\n' | head -n1
%P
格式字符串排除了从参数派生到find
的文件名部分——在本例中,是./
。对于BSD
find
,您没有该选项,但是可以在结果位于shell变量中后处理:# strip "./" prefix from filename variable, if and only if it exists
filename=${filename#./}
至于
head
或tail
,不保证排序,因此您不能依赖这些选项来查找特定文件。如果你想要最新的,最老的,第一个,最后一个,等等,那么你需要做额外的工作,以一种可靠的方式实现这一点。例如:IFS= read -r -d '' filename \
< <(find . -maxdepth 1 -type d -name 'suman-*' -printf '%P\0' | sort -z)
…将在流排序时读取第一个项,并且。。。
IFS= read -r -d '' filename \
< <(find . -maxdepth 1 -type d -name 'suman-*' -printf '%P\0' | sort -rz)
…将按相反的方向排序,从而读取否则将是最后一个的内容。
可移植性说明
注意,
find -print0
和sort -z
都不是POSIX指定的,但是这两个都可以在GNU工具链和当前MacOS上使用。相比之下,find -printf
需要GNU find;这可以通过macportsfindutils
包安装在MacOS上(安装为gfind
)
关于bash - 在bash输出中去除字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754248/