首页 > 解决方案 > Unix shell:如何确保命令适用于最常见的 shell?

问题描述

我有一些使用 jsch 连接到我们的 unix 服务器并在命令下运行的 java 代码。

ls -lt /tempdirectory/ grep -v '^do | grep "$"(date '+%b %e')" | head -1 | awk '{print %9}'

上面的命令以长格式显示 /temp 目录中的所有文件(第一个管道删除目录)。然后从结果中筛选出今天创建的所有文件(即,它为“Oct 16”提供 greps)。因为我做了 ls -lt 文件是按时间排序的,所以当我对 head -1 进行管道时,我今天会得到最新的文件。然后最后一个管道将打印出文件名

在普通的腻子终端上,一旦我切换到 bash shell 并运行上面的命令,它将正确打印出今天的最新文件。

但是默认的 shell 似乎是 Bourne (-sh),上面的命令会失败(因此我的代码会失败)

有没有办法创建对普通 shell 安全的上述命令?我认为我在工作中看到的主要外壳是:

伯恩(sh)再次伯恩(bash)科恩(ksh)

标签: javabashshellunix

解决方案


这是您应该使用该find(1)命令的地方:

$ find /tmpdir -type f -ctime -1 

/tmpdir从今天创建的(ctime)获取所有文件。

如果您想要所有文件,那么您不需要更多的修饰符。如果您想进一步限制,请参阅位于https://linux.die.net/man/1/find的 GNU Find 手册页。

find(1)命令与您可以访问远程计算机上的哪个 shell 无关。


推荐阅读