使用 echo 每行打印一个文件

Emm*_*maV 5 bash echo bash-expansion

如何使用 打印每行一个文件/目录列表echo

我可以用换行符替换空格,但如果文件名包含空格,这将不起作用:

$ echo small*jpg
small1.jpg small2.jpg small photo 1.jpg small photo 2.jpg

$ echo small*jpg | tr ' ' '\n'
small1.jpg
small2.jpg
small
photo
1.jpg
small
photo
2.jpg
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到这一点ls -d1,但也可以使用echo吗?

Sté*_*las 15

echo无论如何都不能用于输出任意数据,printf而是使用它是损坏的echo实用程序的 POSIX 替换来输出文本。

printf '%s\n' small*jpg
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

printf '%s\0' small*jpg
Run Code Online (Sandbox Code Playgroud)

以 NUL 分隔的记录输出列表(因此可以对其进行后处理;例如使用 GNU xargs -r0;请记住,换行符与空格或文件名中的任何字符一样有效)。

在 POSIX 出现之前printf,ksh 已经有一个print实用程序可以替换echo. zsh 复制了它并添加了一个-l选项来打印每行一个参数:

print -rl -- small*jpg
Run Code Online (Sandbox Code Playgroud)

ksh93 添加了一个-f选项以print进行printf类似打印。也被复制zsh,但不是其他 ksh 实现:

print -f '%s\n' -- small*jpg
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有给出任何参数,所有这些仍然打印一个空行。一个更好println的函数可以写成:

println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}
Run Code Online (Sandbox Code Playgroud)

zsh

println() print -rC1 -- "$@"
Run Code Online (Sandbox Code Playgroud)