【问题标题】:Shell: ls and xargs. xargs Prints a single line while expecting there to be a line per file外壳:ls 和 xargs。 xargs 打印一行,同时期望每个文件有一行
【发布时间】:2020-11-21 06:56:53
【问题描述】:

我有以下目录:

> tree
.
├── a.txt
└── b.txt

> ls
a.txt   b.txt

当我运行命令 ls | xargs echo 时,我得到以下信息:

> ls | xargs echo
a.txt b.txt

虽然我希望结果看起来像

> ls | xargs echo
a.txt 
b.txt

鉴于我希望 xargs 单独处理每个文件,而 echo 将每个输入打印在单独的行上。

为什么预期与实际存在差异?


编辑1:

按照建议我已经尝试过:

find . -mindepth 1 -maxdepth 1 -exec echo {} \;

这确实按预期工作,我认为允许使用 -exec 替换其他命令以进行回显。

但是,尝试其他建议以尝试使 xargs 正常工作仍然不起作用(在同一行打印输出)。

例子:

printf "%s\n" * | xargs
a.txt b.txt
> find . -mindepth 1 -maxdepth 1 | xargs echo
./b.txt ./a.txt

【问题讨论】:

  • xargs 默认情况下会在主机操作系统允许的情况下将尽可能多的参数放入它运行的程序的命令行中。如果您希望每行一个,请使用 printf "%s\n" *

标签: bash shell xargs


【解决方案1】:

使用find:

find . -mindepth 1 -maxdepth 1
# or:
find . -mindepth 1 -maxdepth 1 -exec echo {} \;

如果您真的必须解析ls的输出(不是推荐的做法,请参阅cmets),请使用xargs -n1

ls | xargs -n1 echo

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 2021-12-26
    • 1970-01-01
    • 2012-11-10
    • 2018-03-28
    • 2017-04-03
    • 1970-01-01
    • 2010-09-16
    • 2021-11-08
    相关资源
    最近更新 更多