373

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

出于这个原因,我需要生成具有完整路径的递归文件列表。例如,该文件bar具有以下路径:

/home/ken/foo/bar

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

./foo/bar   (from the folder ken)

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

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

4

26 回答 26

366

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

find "$(pwd)" -name .htaccess

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

find "$PWD" -name .htaccess

find只需将它赋予的路径添加到从该路径到文件的相对路径。

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

于 2008-10-29T09:26:35.093 回答
219
readlink -f filename 

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

于 2011-01-02T04:45:05.827 回答
156

将此用于 dirs(bash 中需要/after将其限制为目录):**

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.

于 2010-08-26T06:42:48.097 回答
47

您可以使用

find $PWD 

在 bash

于 2008-10-29T09:27:50.117 回答
32
ls -d "$PWD/"*

这仅在当前目录中查找。如果它包含空格,它会引用“$PWD”。

于 2009-09-15T13:15:50.210 回答
15

命令: 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
于 2019-03-19T23:35:58.273 回答
9

你可以做

ls -1 |xargs realpath

如果您需要指定绝对路径或相对路径您也可以这样做

 ls -1 $FILEPATH |xargs realpath
于 2021-02-20T08:38:01.467 回答
9

试试这个:

find "$PWD"/

您将获得工作目录中的绝对路径列表

于 2021-05-14T12:31:00.747 回答
8

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

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

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

你应该得到:

/home/ken/foo/bar

因此,如果你想要 anls -l并让它返回绝对路径,你可以告诉 find 命令ls -l对它找到的任何东西执行 an 。

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 中工作)。

于 2010-01-29T13:43:55.030 回答
8

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

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

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

find $PWD -type f

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

于 2011-08-09T17:27:44.460 回答
5

fd

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

fd . foo -a

.搜索模式在哪里,foo是根目录。

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

-a,--absolute-path 显示绝对路径而不是相对路径

于 2019-10-24T11:51:44.410 回答
4

只是一个替代品

ls -d "$PWD/"* 

查明这*是壳膨胀,所以

echo "$PWD/"*

会做同样的事情(你不能用-1新行而不是空格来分隔的缺点)。

于 2020-01-07T23:10:32.857 回答
3

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

find $PWD -type f

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

find $PWD -maxdepth 1 -type f
于 2020-05-20T07:03:20.730 回答
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

于 2021-06-16T02:20:52.493 回答
1
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
于 2011-03-31T00:08:33.630 回答
1

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

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
于 2019-03-04T01:00:27.973 回答
1

这对我有用。但它没有按字母顺序列出。

find "$(pwd)" -maxdepth 1

此命令按字母顺序列出以及列出隐藏文件。

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;
于 2019-10-24T08:56:04.927 回答
1

stat

单个文件的绝对路径:

stat -c %n "$PWD"/foo/bar
于 2019-10-24T11:48:54.167 回答
1

你可能想试试这个。

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

for您可以使用循环获得 abs 路径,echo而无需find.

于 2020-03-09T08:38:35.533 回答
1

如果路径包含空格,则大多数(如果不是全部)建议的方法会导致无法直接在某些其他终端命令中使用的路径。理想情况下,结果前面会有斜杠。这适用于我在 macOS 上:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'
于 2020-06-13T20:43:31.787 回答
0

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

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

于 2020-06-08T22:25:19.383 回答
0

在 Linux 中可以通过多种方式列出递归文件。在这里,我将共享一个衬里脚本以清除/var/log/目录中的所有文件日志(仅文件),并第二次检查最近哪个日志文件已进入。

第一的:

find /var/log/ -type f  #listing file recursively 

第二:

for i in $(find $PWD -type f) ; do cat /dev/null > "$i" ; done #empty files recursively 

第三次使用:

ls -ltr $(find /var/log/ -type f ) # listing file used in recent

注意:对于目录位置,您也可以通过$PWD而不是/var/log.

于 2020-08-08T18:40:27.833 回答
0

如果你没有符号链接,你可以试试

tree -iFL 1 [DIR]

-i使树在每一行中打印文件名,而不使用树结构。

-f使树打印每个文件的完整路径。

-L 1避免树递归。

于 2021-02-03T13:44:34.080 回答
0

如果您想要一个在函数中运行良好的动态解决方案,这种方法效果最好

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

于 2021-09-30T18:56:31.460 回答
-1

find / -print会这样做

于 2008-10-29T09:26:47.713 回答
-1
ls -1 | awk  -vpath=$PWD/ '{print path$1}'
于 2010-06-23T20:37:26.000 回答