如何使用 ls/find/etc 获取最后一个文件夹(按字母降序排列并匹配模式)?

如何使用 ls/find/etc 获取最后一个文件夹(按字母降序排列并匹配模式)?

所以我有这些文件系统结构

/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

不解析输出ls

shell 扩展到名称以字母顺序开头/my.parent/my.folder*的子目录列表。打电话没有任何用处。/my.parentmy.folderls

要选择列表的最后一个元素,如果您的 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*

请注意,此答案中的所有代码都假设至少有一个匹配项。

相关内容