ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

/home/ken/foo/bar

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

./foo/bar   (from the folder ken)

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

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

使用:find /home/ken/foo/bar -exec ls -ld $PWD/{} \;

P
Peter Cordes

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

find "$(pwd)" -name .htaccess

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

find "$PWD" -name .htaccess

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

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


请注意,如果您还想解析符号链接,请使用 pwd -P
这很有帮助,但我认为 user431529 在下面的响应更有效:ls -d -1 $PWD/**/* 但我猜 find $PWD 也有效(在 bash 中测试)
@布莱恩为什么? find $PWD 很简单。 ls 咒语复杂且笨拙(除非您给它起别名)。 find 不依赖于 shell glob 扩展,因此可以在任何 shell 中工作。 find 也更加灵活,我可以获得所有文件或所有目录的递归列表,或者我想要所有 xml 文件或上周更改的所有文件的列表。使用 find 可以做到这一切,但使用 ls 却不容易。
由于目录名称中有空格,我不得不使用 find "`pwd`" -name .htaccess
我不明白,这个命令没有给我文件 I 的绝对路径,而列表中的其他答案可以完成这项工作。
b
balki
readlink -f filename 

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


好的。不适用于 readlink 的 BSD 变体(即 Mac)。我在 mac 上使用 gnucoreutils。因此可以使用与上述解决方案一起使用的 greadlink。
@AndrewLazarus - 对于 Mac OS X,请改用 realpath
如果您通过 brew install coreutils 安装 bash 工具,则可执行文件将安装为 /usr/local/opt/coreutils/libexec/gnubin/readlink
P
Peter Cordes

将此用于目录(在 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,则 ** 是递归的。


ls -d -1 $PWD/**/* 不递归。希望我能收回我的 +1。你可以为你需要去的每个深度做**。
** 运算符是递归通配符。如果在支持它的 shell(如 zsh)中使用该命令,它将正常工作。
ls -d1 "$PWD/"{*,.*} 也可以捕获隐藏(点)文件。对我来说,答案中的递归版本没有添加子文件夹中文件的绝对路径。
我想我必须使用 find... 我得到 -> bash: /bin/ls: Argument list too long
V
Vinko Vrsalovic

您可以使用

find $PWD 

在 bash


这将给出当前目录的路径,以及它下面的所有文件和目录。这可能不是人们想要的。
P
Peter Cordes
ls -d "$PWD/"*

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


这仍然是一个非常有效的答案,但最好包含这不能递归工作的信息(这实际上是我正在寻找的!)
对于递归使用:查找 . -exec ls -ld $PWD/{} \;
G
GSM

命令: 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

e
edorian

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

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

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

find $PWD -type f

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


实际上, -d 不仅仅意味着目录 - 它意味着它将目录视为文件。因此,如果您使用 ls -d /home,您将返回“/home”,而不是 /home 中的内容列表。
@Travis:他说的是查找选项,而不是 ls。在他的情况下,“find / -type d”只会找到目录 - 正如他所说。
J
Jabir Ali

你可以做

ls -1 |xargs realpath

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

 ls -1 $FILEPATH |xargs realpath

K
Koder95

尝试这个:

find "$PWD"/

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


如果 $PWD 包含空格则不起作用..:)
C
Cody Gray

如果你给 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 中工作)。


您可以使用 -exec ls -ld {} + 将多个参数传递给同一个 ls 进程。 (您可能希望 -d 没有 ls 列表目录内容)。或者更好的是,将 find 的内置 lsfind ... name bar -ls 一起使用。此外,每个命令一个 arg 的语法错误:您必须从 shell 中引用分号,所以它是 {} \;
k
kenorb

fd

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

fd . foo -a

其中 . 是搜索模式,foo 是根目录。

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

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


M
Marisha

只是一个替代品

ls -d "$PWD/"* 

查明 * 是外壳扩展,所以

echo "$PWD/"*

会做同样的事情(你不能使用 -1 以换行符分隔的缺点,而不是空格)。


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

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

find $PWD -type f

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

find $PWD -maxdepth 1 -type f

g
geosmart

递归查找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


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

M
Mike Behr

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

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

R
Raveen Kumar

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

find "$(pwd)" -maxdepth 1

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

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

k
kenorb

统计

单个文件的绝对路径:

stat -c %n "$PWD"/foo/bar

f
fangxlmr

你可能想试试这个。

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

您可以使用 for 循环和 echo 获得绝对路径,而无需 find


A
Adam

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

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

D
Daniel Kobe

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

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


J
JGurtz

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

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


Y
Yuri

在 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


M
Michael Yan

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

tree -iFL 1 [DIR]

-i 使每行中的树打印文件名,没有树结构。

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

-L 1 避免树递归。


R
Renju Ashokan

写一个小函数

lsf() {
ls `pwd`/$1
}

然后你可以使用喜欢

lsf test.sh 

它给出了完整的路径

/home/testuser/Downloads/test.sh

D
David Arno

find / -print 会这样做


...不幸的是,它会做其他事情(比如显示“一些”其他文件,除非被过滤)
A
Albert
ls -1 | awk  -vpath=$PWD/ '{print path$1}'