bash - 在bash输出中去除字符

标签 bash macos unix cross-platform sh

我有一个对我有效的命令,它将在当前目录中找到与模式匹配的零个或一个目录:

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的文件名部分——在本例中,是./
对于BSDfind,您没有该选项,但是可以在结果位于shell变量中后处理:
# strip "./" prefix from filename variable, if and only if it exists
filename=${filename#./}

至于headtail,不保证排序,因此您不能依赖这些选项来查找特定文件。如果你想要最新的,最老的,第一个,最后一个,等等,那么你需要做额外的工作,以一种可靠的方式实现这一点。例如:
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 -print0sort -z都不是POSIX指定的,但是这两个都可以在GNU工具链和当前MacOS上使用。相比之下,find -printf需要GNU find;这可以通过macportsfindutils包安装在MacOS上(安装为gfind

关于bash - 在bash输出中去除字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754248/

相关文章:

ios - 奇怪的构建错误,类名问题?

swift - 在 swift 中连续运行线程而不阻塞主线程

algorithm - KornShell (ksh) 调度算法 (SRT)

linux - SED 替换为斜线和单词

linux - 在同一个文件夹树上多次调用 find

linux - Bash 脚本在实例化函数后丢失了 shebang 路径

读取管道后 bash 返回代码

linux - Bash 脚本 - 从标准输入或文件获取输入

linux - 在 bash 中取消失败的反向搜索,但保留我输入的内容

swift - Realm、Swift 和 App Sandbox 不工作?