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

dre*_*mac 455 bash command-line ls find

我如何让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
Run Code Online (Sandbox Code Playgroud)

ls -a1 几乎做我需要的,但我不想要路径碎片,我想要完整的路径.

ste*_*anB 530

使用find:

find .
find /home/dreftymac
Run Code Online (Sandbox Code Playgroud)

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

find . -type f
find /home/dreftymac -type f
Run Code Online (Sandbox Code Playgroud)

  • 他的例子展示了文件夹和文件. (6认同)
  • 这个解决方案可以“赎回”像`--sort=extension`这样的`ls`参数吗? (2认同)

gho*_*g74 366

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

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

  • 有人可以解释一下上面的'awk`表达式吗? (6认同)
  • @dreftymac,这意味着,客观地说,这是你有意或无意地写的问题的正确答案.是的,可能这不是你希望*写的问题的正确答案.虽然我同意你的更大观点:"当智者指向月球时,傻瓜看着手指",我们最大限度地减少主观性对评估正确性的影响是公平的,特别是当标准没有任何可能的模糊性时 (4认同)
  • 此解决方案不会省略目录(每个目录都有自己的行) (2认同)
  • 谢谢.顺便说一句,很高兴能在1行中进行快速复制和粘贴. (2认同)
  • 另一个答案应该被接受。这是一个很好的第二个答案,确实回答了所写的问题,但最好的解决方案是使用“find”的解决方案。问题的意图很明确(这并不是说必须使用“ls”来完成),并且这个答案仅对于那些不能使用“find”的人来说更好。声称这个答案更“正确”,因为它回答了“书面”问题而不是“预期”问题,这是非常荒谬的。 (2认同)
  • 您介意解释一下“awk”代码吗?看起来您正在使用正则表达式来捕获以“:”(带有父目录路径的“标题”)结尾的行,但在那之后我迷失了方向,并且绝对不理解最后一个字段“NF”所在的部分被评估为真/假。谢谢! (2认同)

小智 71

ls -ld $(find .)

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

ls -ltd $(find .)

  • -bash:/ bin/ls:参数列表太长 (11认同)
  • 谢谢.我不会想到那个(好的和简短的)语法 - 我会用`find.-name"*" - exec ls -ld'{}'\;`(无论文件数是多少都可以),但是你的命令写得更短;) (3认同)
  • 如果我列出文件有空格的 ntfs 磁盘,ls -ld $(find .) 对我来说会中断:ls:无法访问 ./System:没有这样的文件或目录,但是通过 @SRG 使用引号 find 有效 (2认同)
  • 更短的替代方案(取决于您的需要)是 `find 。-ls`。 (2认同)

小智 57

尝试以下更简单的方法:

find "$PWD"
Run Code Online (Sandbox Code Playgroud)

  • `find"\`pwd \`"`如果路径包含空格或其他特殊字符. (9认同)
  • 这跟"发现"有什么不同?-.- (7认同)
  • @SalmanPK如果你找到一个像`pwd`这样的绝对路径,它将打印绝对路径.顺便说一句,"这与'找到'有什么不同";-) (6认同)
  • 或者"找到"$ PWD"` (4认同)

小智 42

最好的命令是: tree -fi

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

tree -fi |grep -v \>
Run Code Online (Sandbox Code Playgroud)

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

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done
Run Code Online (Sandbox Code Playgroud)

  • @ om01:在osx上它是一个很难的'brew install tr​​ee`,因为你正在使用自制软件 (6认同)
  • 在Mac OS 10.8上还有另一个命令不是OOTB ...为什么是苹果?为什么? (2认同)

God*_*her 40

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

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

find "$PWD" -type f
Run Code Online (Sandbox Code Playgroud)

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

find "$PWD" -type d
Run Code Online (Sandbox Code Playgroud)

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

find "$PWD"
Run Code Online (Sandbox Code Playgroud)

  • 不需要用 grep 进行后处理,在 find 中使用 -name 如下: find "$PWD" -type f -name *.json 如果你想删除列出的文件: find "$PWD" -type f -name * .json -exec rm {} \; 同样,如果你想复制它然后用 cp 和目的地替换 rm: -exec cp {} destination (3认同)
  • 并按扩展名过滤:`find“ $ PWD” -type f | grep'\ .json $'` (2认同)

Jus*_*son 18

我不知道完整的路径,但你可以-R用于递归.或者,如果你没有坚持ls,你可以这样做find *.


Ide*_*lic 16

除ls外不使用外部命令:

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


小智 14

du -a
Run Code Online (Sandbox Code Playgroud)

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


Dmi*_*try 12

找/将做的伎俩


小智 10

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

ls -lR /path/I/need
Run Code Online (Sandbox Code Playgroud)

  • OP只需要完整的路径,而无需其他任何东西。ls -lR不会达到那个目标。 (2认同)

Dim*_*ios 9

我认为最好的方法是:

find -D tree /fullpath/to-dir/ 
Run Code Online (Sandbox Code Playgroud)

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

find -D tree /fullpath/to-dir/ > file.txt
Run Code Online (Sandbox Code Playgroud)

  • 在Mac OS 10.13.3。上试用。查找:非法选项-D (2认同)

小智 8

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

du
Run Code Online (Sandbox Code Playgroud)

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

du | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

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


Grz*_*ywo 8

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

find -type f | xargs ls -1


Den*_*riz 7

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

find /path -type f -exec ls -l \{\} \;
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 6

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

ls -mR * | sed -n 's/://p'
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

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


小智 5

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

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt
Run Code Online (Sandbox Code Playgroud)

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


siv*_*ivi 5

ls -lR 是你在寻找,或至少我是.干杯


Pau*_*eux 5

realpath命令打印解析的路径:

realpath *
Run Code Online (Sandbox Code Playgroud)

要包含点文件,请将输出通过管道传输ls -a到 realpath:

ls -a | xargs realpath
Run Code Online (Sandbox Code Playgroud)

要递归列出子目录:

ls -aR | xargs realpath
Run Code Online (Sandbox Code Playgroud)

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

find -print0 |xargs -0 realpath
Run Code Online (Sandbox Code Playgroud)

另请参阅 Unix 和 Linux stackexchange问题,了解如何使用绝对路径列出目录中的所有文件