我正在编写一个 shell 脚本,它将文件路径作为输入。

因此,我需要生成带有完整路径的递归文件列表。例如,文件 bar 有路径:

/home/ken/foo/bar

但是,据我所知,两者 lsfind 只给出相对路径列表:

./foo/bar   (from the folder ken)

这似乎是一个明显的要求,但我在其中看不到任何内容 find 或者 ls 手册页。

如何在 shell 中生成文件列表(包括它们的绝对路径)?

有帮助吗?

解决方案

如果您给 find 一个绝对路径,它将打印绝对路径。例如,要查找当前目录中的所有.htaccess文件:

find "$(pwd)" -name .htaccess

或者如果你的shell将 $ PWD 扩展到当前目录:

find "$PWD" -name .htaccess

find 只是将它给出的路径预先设置为该路径中文件的相对路径。

Greg Hewgill 如果要解析符号链接,还建议使用 pwd -P 在您当前的目录中。

其他提示

readlink -f filename 

给出完整的绝对路径。但如果文件是符号链接,你将获得最终解析名称。

将此用于dirs(在bash中需要 / 之后的 / 将其限制为目录):

ls -d -1 "$PWD/"**/

这适用于直接位于当前目录下的文件和目录,其名称包含

ls -d -1 "$PWD/"*.*

这适用于所有事情:

ls -d -1 "$PWD/"**/*

从这里采取    http://www.zsh.org/mla/users/2002/msg00033.html

在bash中,如果启用 shopt -s globstar ** 是递归的。

您可以使用

find $PWD 

在bash中

ls -d "$PWD/"*

仅在当前目录中显示。它引用了“$ PWD”。如果它包含空格。

$ PWD 是Matthew上面的一个不错的选择。如果要查找仅打印文件,则还可以添加-type f选项以仅搜索普通文件。其他选项是“d”。仅限目录等。所以在你的情况下它会是(如果我只想搜索带.c ext的文件):

find $PWD -type f -name "*.c" 

或者如果您想要所有文件:

find $PWD -type f

注意:您不能为上述命令创建别名,因为当bash设置别名时,$ PWD会自动完成到您的主目录。

如果你给 find 命令一个绝对路径,它会用绝对路径吐出结果。因此,如果您要从 Ken 目录中键入:

find /home/ken/foo/ -name bar -print    

(而不是相对路径 find . -name bar -print)

你应该得到:

/home/ken/foo/bar

因此,如果您想要一个 ls -l 并让它返回绝对路径,您可以告诉 find 命令执行 ls -l 无论它发现什么。

find /home/ken/foo -name bar -exec ls -l {} ;\ 

笔记:之间有一个空格 {};

你会得到这样的东西:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

如果您不确定文件在哪里,您可以随时更改搜索位置。只要搜索路径以“/”开头,你就会得到一个绝对路径作为返回。如果您正在搜索一个位置(例如 /),您将在其中收到大量权限被拒绝错误,那么我建议您重定向标准错误,以便您实际上可以看到查找结果:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

(2> 是 Borne 和 Bash shell 的语法,但不适用于 C shell。它也可能在其他 shell 中工作,但我只确定它在 Bourne 和 Bash 中工作)。

命令: ls -1 -d" $ PWD /" *

这将给出文件的绝对路径,如下所示。

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

这是一个打印出没有额外句点的列表的示例,还演示了如何搜索文件匹配。希望这会有所帮助:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

find / -print 将执行此操作

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top