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

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

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

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

echo * | xargs -n1 echo

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

答案1

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

xargs 用法的下一个级别是 use xargs -0,输入以 null 分隔。但就你而言, xargs 无论如何都是毫无意义的。

如果要列出目录中的文件,可以使用ls.为了确保每行只有一个文件,请使用ls -1.ls当该命令的输出发送到管道或文件时,该命令始终每行放置一个文件。当输出是终端时,plainls会在列中对齐文件名,但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`

答案2

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

$ touch "foo bar"
$ echo * | xargs -n1 echo
foo
bar

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

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

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

for f in * ; do something with "$f" ; done

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

答案3

当文件名中包含特殊字符时,它不会执行您想要的操作:

$ touch 'name
with newline' 'other name\nwith newline'
$ echo * | xargs -n1 echo
name
with
newline
other
name
with
newline

如果您只想列出文件,则可以使用ls -1.否则find-exec标志一起使用。

相关内容