当我这样做时,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
标志一起使用。