如果我输入:
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,仅有的目录名称。您可以将第一组命令之一的输出重定向到一个文件,将上述命令的输出重定向到第二个文件,然后使用comm
、diff
或类似命令从第一个文件中减去第二个文件,只留下纯文件(非目录)。但不要那样做。
另一种方法(不是很多更好)是
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
。 - shell
globstar
选项似乎未由 POSIX 定义。(事实上,我不确定 POSIX 是否识别任何shell 选项。)虽然它似乎是一种bash
主义,但要小心——它可能并不存在于所有版本的 bash 中。 如果
fonts
或images
有子目录,**
则会以递归方式列出所有子目录。限制深度的一种(有点笨拙和不可靠的)方法是ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
删除包含三个或更多
/
字符的行。