ls命令:如何获取递归全路径列表,每个文件一行?


493

我怎样才能让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 几乎可以满足我的需求,但我不需要路径片段,而需要完整路径。


另请参阅:
dreftymac

Answers:


386

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

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

5
@dreftymac,从客观上来说,这是对您有意提出或没有提出的问题的正确答案。是的,可能不是您希望编写的问题的正确答案。而且,尽管我同意您的更大观点:“当智者指向月球时,傻瓜看着手指”,公平的是,我们将主观性对正确性评估的影响降到最低,尤其是当标准没有任何可能的歧义时
lurscher

1
@dreftymac,我很高兴更改我的投票,但现在它已锁定,您需要编辑问题,以便我可以更新投票
lurscher 2013年

7
有人可以解释以上awk表达吗?
Mert Nuhoglu 2014年

2
此解决方案不会忽略目录(每个目录都有自己的行)
JayB

2
谢谢。顺便说一句,将它放在1行中以便快速复制和粘贴会很好。
Leo Ufimtsev

567

使用查找:

find .
find /home/dreftymac

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

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

2
解决方案可以使用“兑换”之ls类的参数--sort=extension吗?
n611x007 2012年

您甚至可以使用printf输出来显示所需的上下文信息(例如,找到。
type

可以用falg格式化吗?即。python pprint.pprint(files)
内森

72

ls -ld $(find .)

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

ls -ltd $(find .)


11
-bash:/ bin / ls:参数列表太长
jperelli 2012年

1
+1工作对我来说与12106页的文件,我可以使用--sort=extension的参数ls
n611x007

3
谢谢。我自己不会想到那种(精巧又简短的)语法-我会用过的find . -name "*" -exec ls -ld '{}' \;(无论文件数量多大,它都能起作用),但是您的命令写起来要短得多;)
SRG

1
如果我列出的ntfs磁盘上文件有空格,ls -ld $(find。)对我来说很麻烦:ls:无法访问./System:没有这样的文件或目录,但是用@SRG引用找到了引号
kuz8

一个更短的选择(取决于您的需求)将是find . -ls
IanS


44

最好的命令是: tree -fi

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

tree -fi |grep -v \>

如果要了解每个文件的性质,请使用两个whiles(例如,仅读取ASCII文件):

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

谢谢,我不知道tree
丹·菲利蒙

@Nakilon最近的东西是什么?是否显示类似的输出?用命令如何轻松显示类似的输出?
om01 2013年

6
@ om01:在osx上很难brew install tree,因为您正在使用自制软件
ccpizza 2014年

我无法列出这些文件。它也总是列出目录。我怎样才能做到这一点?
kommradHomer 2015年

这应该被评为更高!
der_grund

44

哦,答案很长。这很有帮助,最后,我创建了自己想要的:

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

find "$PWD" -type f

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

find "$PWD" -type d

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

find "$PWD"

2
find "$PWD" -type f | grep '\.json$'
并按

2
无需使用grep进行后处理,在查找中使用-name,例如:find“ $ PWD” -type f -name * .json,如果要删除列出的文件,请执行以下操作:find“ $ PWD” -type f -name * .json -exec rm {} \; 同样,如果要复制,则将rm替换为cp和destination:-exec cp {} destination
Godfather


16

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

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


未知选项“ -1”。中止。
ilw



10

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

ls -lR /path/I/need

3
OP只需要完整的路径,而无需其他任何东西。 ls -lR达不到这个目标。
codeforester

抱歉,它没有做到
Aryeh Beitz

9

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

du

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

du | awk '{print $2}'

编辑-对不起,我不好。我以为只是需要的文件夹。万一将来有人需要它,我会把它留在这里。


有趣,因为它向我显示了我不知道的东西-有点像Google所建议的。事实证明,我喜欢知道每个文件占用多少空间。
杰克·多伦多


9

我认为对于固定清单,最好的方法是:

find -D tree /fullpath/to-dir/ 

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

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

3
在Mac OS 10.13.3。上试用。 find: illegal option -- D
Jayant Bhawal '18年


6

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

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

说明:

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

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

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


很好的答案..正是我所需要的!
Selvin

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

不幸的是,这不会显示递归目录的完整路径,因此它可能不是您要查找的完整解决方案。


同样不幸的是,您不能使用通配符(因为通配符会以普通用户的身份扩展)。
安德鲁·洛里安(Andrew lorien)

4

我看到很多答案。这是我的,如果您使用Mac,我认为非常有用。

我确定您知道有一些“捆绑”文件(.app.rtfd.workflow等)。在Finder的窗口中,它们似乎是单个文件。但事实并非如此。和$ ls$ find看到他们的目录。所以,除非你需要列出其内容为好,这对我的作品:

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

当然,这是针对工作目录的,您可以添加其他捆绑软件的扩展名(但始终在/其后加上a )。或任何其他扩展(如果没有)/

比较有趣的是“ .lpdf/”(多语言pdf)。它具有正常的.pdf扩展名(!!),或者在Finder中没有扩展名。这样,您就可以获取(或仅计算1个文件)pdf而不是一堆东西……


4

ls -lR 是您想要的,或者至少是我想要的。干杯


OP只需要完整的路径,而无需其他任何东西。ls -lR达不到这个目标。
Hadrien TOMA

3

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

#!/bin/bash

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

如果您的系统具备readlink,则可以执行directory=$(readlink -e $1)
已暂停,直到另行通知。

是的,但是cd / pwd组合将在每个系统上运行。 readlink在OS X 10.5.8上,不支持-e选项。
约翰·凯斯

3
tar cf - $PWD|tar tvf -             

这很慢,但是可以递归工作并同时打印目录和文件。如果只希望文件名不包含所有其他信息/目录,则可以使用awk / grep传送它:

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

2
您也可以简单地使用:tar cvf / dev / null $ PWD
RuleB 2013年

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]

1

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

查找$ PWD | fgrep文件名

在Mac OS 10.12.1中完美工作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.