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)
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)
小智 71
ls -ld $(find .)
如果要按修改时间对输出进行排序:
ls -ltd $(find .)
小智 57
尝试以下更简单的方法:
find "$PWD"
Run Code Online (Sandbox Code Playgroud)
小智 42
最好的命令是: tree -fi
要使用文件而不是链接,您必须>
从输出中删除:
tree -fi |grep -v \>
Run Code Online (Sandbox Code Playgroud)
如果你想知道每个文件的性质,(例如只读取ASCII文件)有两个while
s:
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)
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)
Ide*_*lic 16
除ls外不使用外部命令:
ls -R1 /path |
while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done
小智 10
不要复杂。我只是用了这个,得到了一个漂亮的输出:
ls -lR /path/I/need
Run Code Online (Sandbox Code Playgroud)
我认为最好的方法是:
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)
小智 8
对于所有未来的人来说,最简单的方法就是:
du
Run Code Online (Sandbox Code Playgroud)
但是,这也显示了每个文件夹中包含的内容的大小您可以使用awk仅输出文件夹名称:
du | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)
编辑 - 抱歉抱歉,我的不好.我以为这只是需要的文件夹.我会把这个留在这里以防将来有人需要它...
以下是显示目录名称的部分答案.
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)
不幸的是,这不会打印递归目录的完整路径,因此它可能不是您正在寻找的完整解决方案.
该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问题,了解如何使用绝对路径列出目录中的所有文件。