ls命令:我怎样才能得到一个recursion的全path列表,每个文件一行?
我怎样才能让ls吐出一个recursion的一行一行的path列表?
例如,我只想要一个完整path的文件列表:
/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
几乎做我需要的,但我不想要path碎片,我想要完整的path。
如果你真的想使用ls
,那么使用awk格式化它的输出:
ls -R /path | awk ' /:$/&&f{s=$0;f=0} /:$/&&!f{sub(/:$/,"");s=$0;f=1;next} NF&&f{ print s"/"$0 }'
使用find:
find . find /home/dreftymac
如果你只想要文件(省略目录,设备等):
find . -type f find /home/dreftymac -type f
ls -ld $(find .)
如果你想按修改时间sorting你的输出:
ls -ltd $(find .)
尝试以下更简单的方法:
find "$PWD"
最好的命令是: tree -fi
为了使用这些文件,而不是链接,你必须从你的输出中删除>
tree -fi |grep -v \>
如果你想知道每个文件的性质,(例如只读ASCII文件),两个s:
tree -fi | \ grep -v \> | \ while read first ; do file ${first} done | \ while read second; do echo ${second} | grep ASCII done
我不知道完整path,但是可以使用-R
recursion。 另外,如果你不是在ls
,你可以find *
。
除ls之外不使用外部命令:
ls -R1 /path | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done
ls -R1 /path | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done
du -a
方便的一些有限的设备shell查找/定位不可用。
发现/将做的伎俩
对于未来所有人来说,最简单的方法就是:
du
但是,这也显示了每个文件夹中包含的内容的大小您可以使用awk输出文件夹名称:
du | awk '{print $2}'
编辑 – 对不起,对不起。 我认为这只是需要的文件夹。 生病离开这里,以防万一以后有人需要它…
有了使用所有可能的ls选项的自由:
find -type f | xargs ls -1
我认为最好的方式是:
find -D tree /fullpath/to-dir/
(或者为了将其保存在txt文件中)
find -D tree /fullpath/to-dir/ > file.txt
哦,真是一个长长的答案。 它帮了我很多,最后我用自己创造了我想要的东西:
列出目录及其子目录中的所有文件:
find "$PWD" -type f
列出目录及其子目录中的所有目录:
find "$PWD" -type d
列出目录及其子目录中的所有目录和文件:
find "$PWD"
这是显示目录名称的部分答案。
ls -mR * | sed -n 's/://p'
说明:
ls -mR *
列出以“:”结尾的完整目录名称,然后单独列出该目录中的文件
sed -n 's/://p'
查找以冒号结尾的行,剥离冒号并打印行
通过迭代目录列表,我们也应该能够find目录。 仍然在工作。 通过xargs获得通配符是一个挑战。
使用以下格式运行bash命令:
find /path -type f -exec ls -l \{\} \;
ls -lR
就是你要找的东西,至less我是。 干杯
将通配符添加到ls目录的末尾将强制完整path。 现在你有这个:
$ 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
不幸的是,这不会打印recursion到的目录的完整path,所以它可能不是您正在寻找的完整解决scheme。
我看到很多答案。 这是我的,如果你在Mac上工作,我觉得它非常有用。
我相信你知道有一些“捆绑”文件( .app , .rtfd , .workflow等)。 看着Finder的窗户,他们似乎是单一的文件。 但他们不是。 $ ls
或$ find
将它们视为目录…所以,除非你需要列出它们的内容,否则这适用于我:
find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"
当然,这是为工作目录,你可以添加其他包的扩展(但总是与/
后)。 或者其他任何扩展,如果没有捆绑的/
没有。
相当有趣的“ .lpdf/
”(多语言pdf)。 它在Finder中具有普通的“ .pdf
”扩展名(!!)或者没有。 这样你得到(或只是计数1文件)这个pdf
而不是一堆东西…
如果该目录作为相对path传递,则在调用find之前,需要将其转换为绝对path。 在以下示例中,该目录作为第一个parameter passing给脚本:
#!/bin/bash # get absolute path directory=`cd $1; pwd` # print out list of files and directories find $directory
tar cf - $PWD|tar tvf -
这很慢,但recursion地工作并打印目录和文件。 你可以用awk / grep来pipe理它,如果你只想要没有其他所有info /目录的文件名:
tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"
@ ghostdog74:对你的解决scheme做一点小小的调整。
以下代码可用于以完整绝对pathsearch文件。
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]
我知道文件名,但也想要目录。
find$ PWD | fgrep文件名
在Mac OS 10.12.1中完美工作
不要让它变得复杂。 我只是用这个,得到了一个漂亮的输出:
ls -lR /path/I/need