使用“ls”仅打印文件和目录的完整路径

使用“ls”仅打印文件和目录的完整路径

对于给定的目录,请求是打印文件和目录的完整路径

例如

      /a/b/c/
            file1
            file2
            dir1/

命令应该显示

/a/b/c/file1
/a/b/c/file2
/a/b/c/dir1

它的形式可以是

ls -<something> .

或者

ls -<something> /a/b/c

我认为这很容易实现,但在仔细检查了所有ls开关后却没有找到。是我错过了吗 - 还是应该find使用其他类似的东西?

答案1

find几乎可以默认提供所需的格式。有义务的使用以您提供的路径开头的路径名,因此提供/a/b/c

find /a/b/c

相当于

find /a/b/c -print

这里有两个问题:

  1. /a/b/c也将被打印出来。
  2. find递归工作。不清楚dir1您的示例中是否为空或省略了其内容。您可能想要或不想要递归。

如果您支持它们,可以分别通过-mindepth 1和解决该问题:-maxdepth 1find

find /a/b/c -mindepth 1 -maxdepth 1

POSIX 不要求这些选项。使用 POSIX,find您可以/a/b/c使用 来禁止打印! -path /a/b/c;并且您可以-maxdepth 1按照以下步骤“模拟”:将 POSIX 查找限制到特定深度?

这是一个 POSIX 解决方案:

find /a/b/c ! -path /a/b/c -prune

唯一/a/b/c不会通过! -path测试。通过的任何东西都将被修剪,因此该工具不会下降得更深。

提供起始路径为/a/b/c/(注意尾部斜杠)要求您使用! -path /a/b/c/(也带有尾部斜杠),因为find必须完全按照提供的方式引用其起始路径。/a/b/c/不匹配/a/b/c,反之亦然。请记住将参数视为模式,如果您的起始路径包含文字或其他字符,-path这一点很重要*模式匹配符号


你请求了特定的格式,所以也许你想解析输出。在这种情况下find是你的工具,但ls肯定不是,因为你不应该解析输出ls。如果您的find是 GNU find,请检查UNUSUAL FILENAMES中的部分man 1 find。考虑-print0

在评论中你获得了一个链接这个问题。那里的许多解决方案都需要提供某个工具的路径(如readlink)。如果原始路径来自ls,则这已经是“解析”操作ls——不推荐。

但是,对于您来说,另一个问题中的工具可能有助于将相对路径转换./cc完整路径/a/b/c。然后提供完整路径find

相关内容