在Linux中如何生成带有文件绝对路径的列表?

414
我正在编写一个以文件路径为输入的shell脚本。
因此,我需要生成包含完整路径的递归文件列表。例如,文件bar的路径为:
/home/ken/foo/bar

但就我所见,无论是ls还是find都只提供相对路径的列表:

./foo/bar   (from the folder ken)

这似乎是一个显而易见的需求,但我在 findls 的帮助文档中找不到任何相关内容。

如何在 shell 中生成包含文件绝对路径的文件列表?


2
使用以下命令在Linux中查找文件并显示其详细信息:find /home/ken/foo/bar -exec ls -ld $PWD/{} \; - Learner
29个回答

6

这只是一个替代方案

ls -d "$PWD/"* 

为了明确说明*是shell扩展,因此
echo "$PWD/"*

会执行相同的操作(缺点是你不能使用-1来区分换行和空格)。

你能详细解释一下吗?什么是shell扩展?如何使用“-1”来按行分隔? - Antonio
@Antonio Araujo,shell扩展是指shell(例如bash)将*替换为文件列表 - 可以在bash手册页面上阅读更多信息。-1是ls命令选项,echo是其他命令,它没有相同的选项。 - Marisha

5

fd

使用 fd(替代 find),请使用以下语法:

fd . foo -a

这里的 . 是搜索模式,foo 是根目录。

例如,要递归列出 etc 中的所有文件,请运行:fd . /etc -a

-a--absolute-path 显示绝对路径而非相对路径


5

如果您需要列出当前目录和子目录中的所有文件列表

find $PWD -type f

如果您需要列出当前目录中所有文件的清单

find $PWD -maxdepth 1 -type f

2

如果您需要一个在函数中运行良好的动态解决方案,那么这是最好的选择。

lfp ()
{
  ls -1 $1 | xargs -I{} echo $(realpath $1)/{}
}


2

递归查找jar文件并打印绝对路径

`ls -R |grep "\.jar$" | xargs readlink -f`                                                                                                                                                                                                                                                               

/opt/tool/dev/maven_repo/com/oracle/ojdbc/ojdbc8-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ons-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/oraclepki-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/osdt_cert-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/osdt_core-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/simplefan-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ucp-19.3.0.0.jar


2

您可以尝试这个。

for name in /home/ken/foo/bar/*
do
    echo $name
done

您可以使用for循环和echo简单地获取绝对路径,无需使用find


1
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

1
for p in <either relative of absolute path of the directory>/*; do
    echo $(realpath -s $p)
done

1

这将提供规范路径(将解析符号链接):realpath FILENAME

如果您想要符号链接本身的规范路径,则为:realpath -s FILENAME


1

大多数(如果不是全部)建议的方法都会导致路径包含空格时在其他终端命令中无法直接使用。理想情况下,结果应该在前面添加斜杠。

这对我在macOS上有效:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接