回声 * | xargs -n1 echo ,是否有更短、更优雅的逐行列出方式?

sha*_*ant 2 command-line ls pipe xargs echo

当我做ls输出时,输出是在列中,但是我需要输出只在一列中,一行一行,每行一个条目。

所以我能想出的唯一方法是:

echo * | xargs -n1 echo
Run Code Online (Sandbox Code Playgroud)

这是实现它的标准方法还是这种糟糕的风格?

Gil*_*il' 8

关于 xargs 的一般建议是,不要使用xargs. 任何常用工具都不支持其输入格式。

xargs 使用的下一个级别是 use xargs -0,输入以空值分隔。但在你的情况下, xargs 无论如何都是毫无意义的。

如果要列出目录中的文件,可以使用ls. 为确保每行只有一个文件,请使用ls -1. ls当输出到管道或文件时,该命令总是每行放置一个文件。当输出是终端时,plain 会ls在列中对齐文件名,但ls -1不会。

如果您有一个单词列表,并且希望每行打印一个单词,则可以使用printf '%s\n'. 这与 类似echo,不同之处在于它在每个元素后打印换行符而不是空格,并且没有反斜杠或初始破折号处理的危险。

printf '%s\n' *          # prints the names of the files in the current directory
printf '%s\n' "$@"       # prints the positional arguments
printf '%s\n' "${a[@]}"  # prints the element of the array `a`
Run Code Online (Sandbox Code Playgroud)


ilk*_*chu 5

这很糟糕,因为所有原因 plainxargs都不好,即它会破坏包含空格或反斜杠的文件名:

\n\n
$\xc2\xa0touch "foo bar"\n$ echo * | xargs -n1 echo\nfoo\nbar\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,它为每个文件运行(外部)命令的副本echo

\n\n

在大多数 shell 中,您可以使用它printf "%s\\n" *来获取列表。或者ls -1

\n\n

但是,问题是,您想对文件列表做什么?只是查看它们还是在脚本中使用它们?对于后者,您可能最好使用

\n\n
for f in * ; do something with "$f" ; done\n
Run Code Online (Sandbox Code Playgroud)\n\n

或某些变体find ... -exec somecmd {} +

\n