Answers:
如果添加一些psychedlics(ls -d
),你可以简单地坚持ls :
# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*
A/file B/file C/file
find
是一个胖胖的野兽。
你可能对“穷人”感兴趣find
:
shopt -s globstar
shopt -s
找到命名的shell选项。该globstar
选项在bash(1)中定义如下:
如果设置,则
**
文件名/路径名扩展上下文中使用的模式将匹配文件[sic]和零个或多个目录和子目录。如果模式后跟a/
,则只有目录和子目录匹配。
所以,完成后shopt -s globstar
,请执行以下任何命令:
ls -d1 - source / ** #'d'后面的字符是数字1。 ls -d - source / ** | cat #ie,它会将其写入管道中的任何命令。 printf“%s \ n”来源/ **
将产生输出:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
不幸的是,这也包括目录名称。它可以帮助你有点知道
printf "%s\n" source/**/
将产生输出:
source/
source/fonts
source/images
即,只有目录名称。你可能在第一组命令之一的输出重定向到一个文件,重定向上述的第二文件的输出,然后用comm
,diff
或类似的东西,减去从第一个第二个文件,只留下普通文件(非目录)。但是不要这样做。
另一种方法(这不是多好)是
ls -d --file-type -- source/** | grep -v '/$'
该--file-type
选项告诉ls
显示/
每个目录名称的末尾(以及其他(特殊)文件类型末尾的其他字符),如下所示:
来源// #添加了一个额外的 源/字体/ #添加了一个 源极/字体/ fontello source / images / #添加一个 源极/图像/ bg1.png 源极/图像/ eng.png 源极/图像/ fra.png
然后grep -v '/$'
删除以...结尾的行/
; 即目录名称。不幸的是,POSIX--file-type
没有指定该选项。如果您的版本ls
不支持,请使用-F
。这就像--file-type
它除了它还显示*
在可执行文件的名称的末尾,有些人觉得烦人。你可以用sed
以下方法消除它们
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
如果你想对所有文件(只有文件)做一些事情,你可以这样做
for f in source / ** 做 如果[-f“$ f”] 然后 在此处插入要应用于纯文件的命令。 科幻 DONE
ls
输出到终端,并且它不在-l
(l ong)模式时,它每行写入多个名称(除非名称很长)。您可以通过指定-1
(一个)或通过将输出重定向到文件或管道来强制它为每行写一个名称。--
的ls
命令,因为你列出一个目录,其内容创建。您应该*
在未知目录中列出时使用它,以防止以文件名开头-
。ls
。globstar
外壳选项出现不被POSIX定义。(事实上,我不确定POSIX是否识别任何 shell选项。)虽然它似乎是一个bash
主义,但要注意 - 它可能不会出现在所有版本的bash中。如果fonts
或images
具有子目录,**
将以递归方式将它们全部列出。一种(有点kludgy和不可靠)限制深度的方法是
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
删除包含三个或更多/
字符的行。
find
错误;特别是,如果你正在运行for file in $(find ...)
,你已经击中了其中一个)。