我有一个特定的文件顺序,如果存在的话,我想列出它们;大约 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