将文件的内容管道输入到ls

时间:2017-06-24 19:01:58

标签: bash

我有一个名为“input.txt。”的文件,其中包含一行:

/bin

我想使文件的内容成为命令ls

的输入

我试过

cat input.txt | ls

但它不会输出 / bin 目录中的文件列表

我也试过

ls < input.txt

无济于事。

3 个答案:

答案 0 :(得分:6)

您正在寻找xargs命令。

xargs ls < input.txt

您说您希望/bin成为ls的“输入”,但这不正确; ls对其输入不做任何事情。相反,您希望/bin作为命令行参数传递给ls

输入和参数是完全不同的东西;将文本作为输入提供给命令与将该文本作为参数提供不同。许多命令(例如cat)将对其输入或其参数(或两者)进行操作,这可能会使差异变得模糊 - 但即便如此,我们发现了一个重要的区别:它们实际操作的是名称文件内容作为参数传递。

xargs命令专门用于在这两件事之间进行转换:它将其输入解释为以空格分隔的命令行参数列表,以传递给其他命令。另一个命令作为命令行参数提供给xargs,在本例中为ls

由于shell通过<提供的输入重定向,xargs提供给ls的参数来自input.txt文件。

还有其他方法可以完成同样的事情;例如,只要input.txt中没有那么多文件,它们就不适合单个命令行,你就可以这样做:

ls $(< input.txt)

上述命令和xargs版本都会将input.txt文件中的任何空格视为分隔文件名,因此如果您的文件名包含空格字符,则必须执行更多工作来解释文件正确。另请注意,如果任何文件名包含通配符/“glob”字符,例如?*[ ... ],则$(<。 .. )版本会将它们扩展为通配符模式,而xargs则不会。

答案 1 :(得分:1)

尝试xargs

cat file | xargs ls

哦,伙计,我必须把它放到30个字符长;)

答案 2 :(得分:1)

ls从其命令行获取文件名,而不是| lsls < file将使用的标准输入。

如果input.txt中只列出了一个文件且文件名不包含尾随换行符,则可以使用(注释引号):

ls "$(cat input.txt)"

或几乎所有普通的POSIX shell:

ls "$(< input.txt)"

如果文件中有很多文件名,您要使用xargs,但要处理名称中的空格,请使用-d "\n"(使用GNU xargs)来获取每一行作为文件名。

xargs -d "\n" ls < input.txt

或者,如果您需要使用换行符处理文件名,可以使用输入中的NUL字节将它们分开,并使用

xargs -0 ls < input.txt

(即使只有一个文件名,这也有效。)