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