如何在一行中获取文件名及其绝对路径?

如何在一行中获取文件名及其绝对路径?

我想逐行列出文件夹中的所有文件及其各自的绝对路径,如下所示,

filename1  /home/.../file1  
filename2 /home/.../file2  
filename3 /home/.../file3  

我尝试过find $(pwd) -type f,但它只给出了路径。

答案1

使用 GNU find

find "$PWD" -type f -printf '%f %h/%f\n'
  • %f删除所有前导目录的文件名(仅最后一个元素)。
  • %h文件名的前导目录(除了最后一个元素之外的所有目录)。如果文件名不包含斜杠(因为它位于当前目录中),%h 说明符将扩展为“.”。

答案2

与标准find

find "$PWD" -type f -exec sh -c '
    for pathname do
        printf "%s\t%s\n" "${pathname##*/}" "$pathname"
    done' sh {} +

这将打印当前目录中或当前目录下所有文件的制表符分隔列表。第一列将包含文件的文件名,第二列将包含文件相对于当前目录($PWD搜索路径中的绝对路径)的路径名。

这是通过将找到的路径名批量提供给一个简短的内联脚本来完成的,该脚本仅以首选格式输出名称。参数替换${pathname##*/}扩展到 的值,$pathname并删除最后一个之前的所有内容/

请注意,包含换行符的文件名将出现在多行中,并且很难正确区分包含制表符的文件名。假设结果是用于查看而不是解析,那可能没问题。

答案3

你好,谢谢提及fselect

奇怪的文件名问题显然并不新鲜。我们甚至无法确定文件名及其路径是否位于同一行(如果它们包含\n在其中)。为了解决这些问题,fselect支持INTO选项

最简单的变体是用于INTO LIST进一步解析xargs.人们可能INTO JSON会对更精细的处理感兴趣。

答案4

zsh

for f (**/*(DN)) print -r -- $f $f:P

$f:P相当于将realpath()so 扩展到文件的规范绝对路径(将路径组件中的所有符号链接递归地扩展到其目标)。

相关内容