如何防止“ls”对输出进行排序?

如何防止“ls”对输出进行排序?

我有一个特定的文件顺序,如果存在的话,我想列出它们;大约 40 个文件。某种优先权。所以我尝试:

ls -1d         /opt/foo/lib.jar /opt/bar/lib.jar

/opt/foo/lib.jar如果两者都存在,我希望这会首先列出。但实际上它打印了bar第一个和foo之后的内容。

有没有某种方法可以ls按照参数中给出的顺序列出条目?
或者一些替代方法find

答案1

使用 GNU ls,您可以尝试以下-U选项:

-U:不排序;按目录顺序列出条目

(虽然在这里,我们没有列出目录的内容,所以重要的部分是不排序)。

$ ls -1dU /opt/foo/lib.jar /opt/bar/lib.jar
/opt/foo/lib.jar
/opt/bar/lib.jar

稍微更便携(适用于 GNU 和 FreeBSD ls,但不适用于传统ls实现,也不是 POSIX ),您可以使用ls -1df

$ ls -1df /opt/foo/lib.jar /opt/bar/lib.jar
/opt/foo/lib.jar
/opt/bar/lib.jar

答案2

提到后find,我发现它可以采用多个路径作为路径参数。所以很简单:

 find /opt/foo/lib.jar /opt/bar/lib.jar -prune 2> /dev/null

答案3

ls您可以创建一个围绕参数循环的包装函数(按照给出的顺序),调用ls每个参数:

myls() {
  for arg do
    ls -d -- "$arg"
  done
}

参考Stéphane的回答如何在 for 循环中使用 $1 $2 ... 等参数?对于for arg do语法。

答案4

如果您有一个想要检查并测试是否存在的路径名列表,那么我假设您想要对确实存在的路径名、不存在的路径名或不存在的路径名执行某些操作两组路径名。

给定一个标准 shell,这最好在循环中完成。

for pathname in /the/first/path /the/second/path /some/other/path
do
    if [ -e "$pathname" ]; then
        printf 'Path "%s" exists\n' "$pathname"
    else
        printf 'Path "%s" does not exist\n' "$pathname"
    fi
done

相关内容