因此,我需要生成包含完整路径的递归文件列表。例如,文件
bar
的路径为:/home/ken/foo/bar
但就我所见,无论是ls
还是find
都只提供相对路径的列表:
./foo/bar (from the folder ken)
这似乎是一个显而易见的需求,但我在 find
或 ls
的帮助文档中找不到任何相关内容。
如何在 shell 中生成包含文件绝对路径的文件列表?
bar
的路径为:/home/ken/foo/bar
但就我所见,无论是ls
还是find
都只提供相对路径的列表:
./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
。
pwd -P
。 - Greg Hewgillls -d -1 $PWD/**/*
不过我猜在bash中也可以用 find $PWD
(已测试)。 - Brianfind $PWD
呢?这很简单。相比之下,ls
命令则复杂而难以掌握(除非你将其设置别名)。find
命令不依赖于shell的通配符扩展,因此适用于任何shell。另外find
更加灵活,可以递归地列出所有文件,或者只列出目录,或者列出所有XML文件,还可以列出在最近一周内修改过的所有文件。这些都是通过find
命令实现的,但使用ls
却不太容易。 - Matthew Scharleyfind "\
pwd`" -name .htaccess`。 - Paulo Casarettopwd
输出什么?我只是用它作为一个例子,但只要你给find
一个绝对路径,它就应该输出绝对路径。 - Matthew Scharleyreadlink -f filename
返回完整的绝对路径。但如果文件是符号链接,你将得到最终解析的名称。
brew install coreutils
安装bash工具,则可执行文件将安装为/usr/local/opt/coreutils/libexec/gnubin/readlink
。 - redolentreadlink -f
可以直接使用,无需GNU coreutils
。 - undefined对于目录使用这个(在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"以防其包含空格。
命令: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
你可以做到
ls -1 | xargs realpath
如果需要指定绝对路径或相对路径,也可以这样做
ls -1 $FILEPATH | xargs realpath
ls -1
是管道 ls
的默认设置:https://unix.stackexchange.com/a/410557/537347 - YouJiacheng试试这个:
find "$PWD"/
您可以在工作目录中获得绝对路径列表。
$PWD
是Matthew提供的一个不错的选择。如果你想让find命令只打印文件,那么你还可以添加“-type f”选项来搜索普通文件。其他选项包括只搜索目录等等。所以在你的情况下,如果我想要搜索扩展名为.c的文件,命令应该是:
find $PWD -type f -name "*.c"
如果您想要所有文件:
find $PWD -type f
如果您在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 shells的语法,但在C shell中无法使用。它可能也适用于其他shell,但我只知道它在Bourne和Bash中可以使用)。
-exec ls -ld {} +
向相同的ls
进程传递多个参数(可能需要使用-d
来避免列出目录内容)。更好的做法是,使用find
的内置ls
,并使用find ... name bar -ls
。另外,对于每个命令一个参数的语法错误:您必须从shell中引用分号,因此为{} \;
。 - Peter Cordes
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
- Learner