如何获得一个递归的全路径列表,每个文件一行?

我如何吐出一行递归路径的平面列表?

例如,我只想要一个文件的完整路径的平面列表:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1几乎满足了我的需要,但我不想要路径片段,我想要完整的路径。

722477 次浏览

我不知道完整的路径,但您可以使用-R进行递归。或者,如果你不倾向于ls,你可以只做find *

找到/就行了

使用找到:

find .
find /home/dreftymac

如果你只想要文件(忽略目录,设备等):

find . -type f
find /home/dreftymac -type f

如果将目录作为相对路径传递,则需要在调用find之前将其转换为绝对路径。在下面的例子中,目录作为第一个参数传递给脚本:

#!/bin/bash


# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find "$directory"

如果你真的想使用ls,那么使用awk格式化它的输出:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

除了ls,不使用任何外部命令:

ls -R1 /path |
while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done

# EYZ0

如果你想根据修改时间对输出进行排序:

# EYZ0

试试下面的简单方法:

find "$PWD"

对你们这些未来的人来说,最简单的方法就是:

du
但是,这也显示了每个文件夹中包含的内容的大小 您可以使用awk只输出文件夹名称:

du | awk '{print $2}'

编辑-对不起对不起,我的错。我以为只要文件夹就行了。 我把这个放在这里,以防将来有人需要它

最好的命令是:tree -fi

-f打印每个文件的完整路径前缀
-i不输出缩进

如。

$ tree -fi
.
./README.md
./node_modules
./package.json
./src
./src/datasources
./src/datasources/bookmarks.js
./src/example.json
./src/index.js
./src/resolvers.js
./src/schema.js

为了使用文件而不是链接,你必须从输出中删除>:

tree -fi |grep -v \>

如果你想知道每个文件的性质,(例如只读取ASCII文件)尝试while循环:

tree -fi |
grep -v \> |
while read -r first ; do
file "${first}"
done |
grep ASCII

拥有使用所有可能的ls选项的自由:

# EYZ0

tar cf - $PWD|tar tvf -

这是缓慢的,但递归地工作,并打印目录和文件。你可以用awk/grep管道它,如果你只是想要文件名,而不是所有其他的信息/目录:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"

下面是显示目录名称的部分答案。

ls -mR * | sed -n 's/://p'

解释:

ls -mR *列出以':'结尾的完整目录名,然后分别列出该目录中的文件

sed -n 's/://p'查找以冒号结尾的行,去掉冒号并打印该行

通过遍历目录列表,我们也应该能够找到目录。还在努力中。通过xargs获取通配符是一个挑战。

我看到了很多答案。这是我的,如果你在Mac上工作,我觉得很有用。

我相信你知道有一些“包”文件(.app.rtfd.workflow,等等)。查看Finder的窗口,它们似乎是单个文件。但事实并非如此。$ ls$ find将它们视为目录…所以,除非你需要列出它们的内容,这对我来说是可行的:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

当然,这是工作目录,你可以添加其他包的扩展(但后面总是有/)。或者任何其他扩展,如果没有捆绑没有/

非常有趣的“.lpdf/”(多语言pdf)。它有正常的“.pdf”扩展名(!!)或在Finder中没有。这样你得到(或它只是计算1个文件)这个pdf,而不是一堆东西…

我认为最好的方法是:

find -D tree /fullpath/to-dir/

(或者为了保存到TXT文件中)

find -D tree /fullpath/to-dir/ > file.txt
du -a

方便一些有限的设备外壳的查找/定位不可用。

运行bash命令,格式如下:

find /path -type f -exec ls -l \{\} \;

同样地,修剪掉-l细节,只返回绝对路径:

find /path -type f -exec ls \{\} \;

在ls目录的末尾添加通配符将强制执行全路径。现在你有这个:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

你可以这样做:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

不幸的是,这不会打印递归目录的完整路径,因此这可能不是您正在寻找的完整解决方案。

< p > @ghostdog74: 对你的解决方案稍作调整。
下面的代码可用于搜索文件的完整绝对路径
sudo ls -R / | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }' | grep [file_to_search]

ls -lR是你一直在寻找的,至少我是。干杯

我知道文件名,但也想知道目录。

find $PWD | fgrep filename

在Mac OS 10.12.1中完美运行

不要把事情搞复杂。我只是使用这个,得到了一个漂亮的输出:

ls -lR /path/I/need
哦,真是一长串的答案。 这很有帮助,最后,我创建了我自己的,我正在寻找:

列出目录及其子目录下的所有文件。

find "$PWD" -type f

列出目录及其子目录下的所有目录。

find "$PWD" -type d

列出目录及其子目录下的所有目录和文件。

find "$PWD"

从当前位置的所有文件递归列表:

# EYZ0

realpath命令打印解析后的路径:

realpath *

要包含点文件,将ls -a的输出管道到realpath:

ls -a | xargs realpath

递归列出子目录:

ls -aR | xargs realpath

如果你在文件名中有空格,man xargs建议使用-o选项来防止文件名被错误地处理,这与find -print0的输出效果最好,它开始看起来比其他答案复杂得多:

find -print0 |xargs -0 realpath

参见Unix和Linux stackexchange 关于如何列出具有绝对路径的目录中的所有文件的问题

如果你必须在100gb或更大的内存上搜索。 我建议执行命令tree@kerkael发布而不是findls.

然后执行命令tree,唯一不同的是,我建议将输出写入文件。

例子:

tree -fi > result.txt

之后,使用grep -i "*.docx" result.txt这样的模式在文件中执行grep command,这样就不会丢失时间,而且这种方式在大内存中搜索文件更快。

我在270GB内存上执行这些命令,我得到了一个100MB的文件txt。 啊,执行命令tree所花费的时间是14分钟。 # EYZ0 < / p >