我有一个名为“input.txt。”的文件,其中包含一行:
/bin
我想使文件的内容成为命令ls
我试过
cat input.txt | ls
但它不会输出 / bin 目录中的文件列表
我也试过
ls < input.txt
无济于事。
答案 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
从其命令行获取文件名,而不是| ls
和ls < 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
(即使只有一个文件名,这也有效。)