关于bash:ls命令:如何获得递归的完整路径列表,每个文件一行?

ls command: how can I get a recursive full-path listing, one line per file?

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

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

1
2
3
4
5
6
7
/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几乎可以满足我的需求,但我不想要路径碎片,我想要完整的路径。


使用find:

1
2
find .
find /home/dreftymac

如果只需要文件(省略目录,设备等):

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


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

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


ls -ld $(find .)

如果要按修改时间对输出进行排序:

ls -ltd $(find .)


尝试以下更简单的方法:

1
find"$PWD"


最好的命令是:tree -fi

要使用文件而不使用链接,您必须从输出中删除>

1
tree -fi |grep -v \>

如果你想知道每个文件的性质,(例如只读取ASCII文件)有两个while

1
2
3
4
5
6
7
8
tree -fi | \
grep -v \> | \
while read first ; do
    file ${first}
done | \
while read second; do
    echo ${second} | grep ASCII
done


哦,真的是一长串的答案。
它帮助了很多,最后,我创建了自己的,我正在寻找:

列出目录及其子目录中的所有文件:

1
find"$PWD" -type f

列出目录及其子目录中的所有目录:

1
find"$PWD" -type d

列出目录及其子目录中的所有目录和文件:

1
find"$PWD"


我不知道完整路径,但您可以使用-R进行递归。或者,如果你没有弯腰ls,你可以做find *


除ls外不使用外部命令:

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


1
du -a

对于某些找不到/找不到的有限设备外壳很方便。


找/将做的伎俩


我认为最好的方法是:

1
find -D tree /fullpath/to-dir/

(或者为了将其保存在txt文件中)

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


不要让它变得复杂。我刚用过这个并获得了很好的输出:

1
ls -lR /path/I/need


对于所有未来的人来说,最简单的方法就是:

1
du

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

1
du | awk '{print $2}'

编辑 - 抱歉抱歉,我的不好。我以为这只是需要的文件夹。
我会把这个留在这里以防将来有人需要它...


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

find -type f | xargs ls -1


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

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

说明:

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

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

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


使用以下格式运行bash命令:

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

将通配符添加到ls目录的末尾会强制使用完整路径。现在你有这个:

1
2
3
4
5
6
7
$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

你可以这样做:

1
2
3
4
5
6
7
8
$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

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


ls -lR是您正在寻找的,或至少我是。干杯


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

我相信你知道有一些"捆绑"文件(.app,.rtfd,.workflow等)。看着Finder的窗口,他们似乎是单个文件。但他们不是。 $ ls$ find将它们视为目录......所以,除非你需要列出它们的内容,否则这对我有用:

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

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

相当有趣的".lpdf/"(多语言pdf)。它在Finder中具有正常的".pdf"扩展名(!!)或无。这样你得到(或者只计算1个文件)这个pdf而不是一堆东西......


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

1
2
3
4
5
6
#!/bin/bash

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


1
tar cf - $PWD|tar tvf -

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

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


@ ghostdog74:
对您的解决方案进行微调。

以下代码可用于搜索具有完整绝对路径的文件。

1
2
3
4
sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }'
| grep [file_to_search]


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

找到$ PWD | fgrep文件名

在Mac OS 10.12.1中完美运行