Bash:ls * 不带文件夹分组

Bash:ls * 不带文件夹分组

如果我输入:

ls source/*

source/fonts:
fontello

source/images:
bg1.png                eng.png        fra.png   

我获取了按文件夹名称分组的文件列表。如何才能简单地获取文件名列表?

ls source/*

source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png   

谢谢

答案1

如果不改变输出似乎是不可能的,但这里有一个简单的替代方法:

find source/ -type f

或者(特定于 GNU find),仅获取问题深度的文件:

find source/ -type f -mindepth 2 -maxdepth 2

(或者如果您想要类似的目录ls,请删除-type f

答案2

ls -d如果你添加一些迷幻剂( ),那么你可以简单地坚持使用 ls :

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

答案3

您可能对“穷人的find”感兴趣:

shopt -s globstar

shopt -s s设置指定的 shell 选项。globstar选项定义如下重击(1)

如果设置,文件名/路径名扩展上下文中使用的模式**将匹配文件[sic]和零个或多个目录和子目录。如果模式后跟/,则仅匹配目录和子目录。

因此,完成后shopt -s globstar,执行以下任何命令:

ls -d1 --源/**                 # 'd' 后面的字符是数字一。
ls -d --源/** | cat            # 即,它会将其写入任何命令的管道中。
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

IE,仅有的目录名称。您可以将第一组命令之一的输出重定向到一个文件,将上述命令的输出重定向到第二个文件,然后使用commdiff或类似命令从第一个文件中减去第二个文件,只留下纯文件(非目录)。但不要那样做。

另一种方法(不是很多更好)是

ls -d --file-type -- source/** | grep -v '/$'

--file-type选项告诉 在每个目录名称末尾ls显示一个(以及其他(特殊)文件类型末尾的其他字符),如下所示:/

来源//                            # 增加了一个
源/字体/                       # 添加一个
源/字体/fontello
来源/图片/                      # 添加一个
来源/图片/bg1.png
来源/图片/eng.png
来源/图片/fra.png

然后grep -v '/$'删除以 ; 结尾的行/,即目录名称。不幸的是,该--file-type选项不可用由 POSIX 指定。如果您的版本ls不支持,请使用-F。它类似于,除了它还在可执行文件的名称末尾--file-type 显示一个,有些人觉得很烦人。您可以使用以下方式消除它们:*sed

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

如果你想对所有文件(并且只对文件)进行某些操作,你可以这样做

对于源中的 f/​​*
    如果[-f“$f”]
    然后
        在此处插入要应用于纯文本文件的命令。
完毕

笔记:

  • ls输出到终端时,它不在-l在 ong) 模式下,它会在每行中写入多个名称(除非名称很长)。您可以通过指定-1(one) 或将输出重定向到文件或管道来强制它在每行中写入一个名称。
  • 由于您正在列出由您创建的目录,因此您可能实际上不需要命令--中的 。您应该在列出未知目录时使用它,以保护自己免受以 开头的文件名的侵害。ls*-
  • 不要尝试解析的输出ls
  • shellglobstar选项似乎未由 POSIX 定义。(事实上,我不确定 POSIX 是否识别任何shell 选项。)虽然它似乎是一种bash主义,但要小心——它可能并不存在于所有版本的 bash 中。
  • 如果fontsimages有子目录,**则会以递归方式列出所有子目录。限制深度的一种(有点笨拙和不可靠的)方法是

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    删除包含三个或更多/字符的行。

相关内容