所以我有这些文件系统结构
/my.parent
-> my.folder1
-> my-file1.txt
-> my.folder2
-> my-file2.txt
-> another-folder-here
-> another-file.txt
使用这一系列命令:
ls -r /my.parent/my.folder* | head -n 1 | rev | cut -c 2- | rev
它返回 my.folder2 的完整路径,这就是我想要的。我的问题是,如果只有 1 个文件夹与该模式匹配(例如,我删除/移动 my.folder1),我会得到 my.folder2 的内容列表,而不是获取完整路径。
关于如何修复它以便在所有情况下都有效的任何想法?多谢。
答案1
要ls
显示文件夹名称而不是列出其内容,请使用其-d
参数,例如:
ls -ld ~
答案2
ls
在 bash 或其他具有数组的 shell 中没有, (即使名称中包含有趣的字符,这也应该有效):
$ names=( my.parent/my.folder* ); echo ${names[-1]}
my.parent/my.folder2
没有数组(对于有趣的字符来说不是那么强大,但可以节省 的分叉ls
):
$ printf "%s\n" my.parent/my.folder* | tail -1
my.parent/my.folder2
答案3
shell 扩展到名称以字母顺序开头/my.parent/my.folder*
的子目录列表。打电话没有任何用处。/my.parent
my.folder
ls
要选择列表的最后一个元素,如果您的 shell 有数组,请将列表放入数组中并选择最后一个元素。
directories=(/my.parent/my.folder*)
last_directory="${directories[${#directories}-1]}"
如果您的 shell 没有数组,您可以通过位置参数来完成此操作。
set -- /my.parent/my.folder*
eval "last_directory=\${$#}"
这将覆盖当前的位置参数。为了避免这种情况,请使用函数。
set_to_last () {
eval "$1=\${$#}"
}
set_to_last last_directory /my.parent/my.folder*
请注意,此答案中的所有代码都假设至少有一个匹配项。