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

时间:2009-11-19 23:39:07

标签: bash command-line find ls

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

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

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

25 个答案:

答案 0 :(得分:490)

使用find:

find .
find /home/dreftymac

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

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

答案 1 :(得分:341)

如果您确实想使用ls,请使用awk格式化其输出:

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

答案 2 :(得分:70)

ls -ld $(find .)

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

ls -ltd $(find .)

答案 3 :(得分:50)

尝试以下更简单的方法:

find "$PWD"

答案 4 :(得分:38)

最佳命令是:tree -fi

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

tree -fi |grep -v \>

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

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

答案 5 :(得分:32)

哦真的很长的答案清单。 它帮助了很多,最后我创建了我自己想要的东西:

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

buff

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

find "$PWD" -type f

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

find "$PWD" -type d

答案 6 :(得分:17)

我不知道完整路径,但您可以使用-R进行递归。或者,如果您不熟悉ls,则可以find *

答案 7 :(得分:14)

除ls:

外不使用任何外部命令
ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done

答案 8 :(得分:13)

du -a

对于某些无法查找/定位的有限设备外壳,非常方便。

答案 9 :(得分:12)

找/将做的伎俩

答案 10 :(得分:9)

我认为最好的方法是:#/ p>

find -D tree /fullpath/to-dir/ 

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

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

答案 11 :(得分:8)

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

du

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

du | awk '{print $2}'

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

答案 12 :(得分:8)

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

ls -lR /path/I/need

答案 13 :(得分:7)

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

find -type f | xargs ls -1

答案 14 :(得分:6)

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

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

说明:

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

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

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

答案 15 :(得分:6)

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

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

答案 16 :(得分:5)

在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

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

答案 17 :(得分:5)

'John Smith' //with two spaces between the first name and last name.正是您所寻找的,或至少我是。欢呼声

答案 18 :(得分:4)

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

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

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

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

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

答案 19 :(得分:3)

tar cf - $PWD|tar tvf -             

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

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

答案 20 :(得分:3)

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

#!/bin/bash

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

答案 21 :(得分:2)

@ ghostdog74: 对您的解决方案进行微调。
以下代码可用于以完整的绝对路径搜索文件。

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]

答案 22 :(得分:2)

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

ls -l $(find . -type f)

答案 23 :(得分:1)

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

找到$ PWD | fgrep文件名

在Mac OS 10.12.1中完美运行

答案 24 :(得分:1)

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 question on how to list all files in a directory with absolute path