如何使 wc 将标准解释为文件列表

如何使 wc 将标准解释为文件列表

我知道还有其他方法可以解决此问题,但我希望能够将wcstdin 解释为文件名或文件名列表。例如,

ls JP*/std* | wc

会起到同样的作用

wc JP*/std*

我猜想调整这种行为是不可能的,但我正在编写一个脚本,这会让我的生活变得更轻松。谢谢。

答案1

find与 结合使用xargs。我推荐的唯一原因find是利用该-print0选项,该选项用 NUL 分隔文件名;这有助于避免文件名包含空格的问题。

find .  -maxdepth 1 -type f -print0 | xargs -0 wc

答案2

如果您想获取命令的输出并将其用作 的输入文件列表wc,您可能可以执行以下操作:

wc $(ls JP*/std*)

它运行ls JP*/std*并且它的输出作为参数传递给wc.

xargs在这里可能对您也有用:

ls JP*/std* | xargs wc

请参阅xargs联机帮助页有关如何使用它的更多详细信息,因为它非常灵活。

答案3

看完你的评论后

输入可能来自文件,

如果文件列表已存在于您的文件中,您可以跳过查找部分并仅使用该xargs部分。

请参阅xargs手册页。

使用-a选项传递文件的文件名,其中是必须读取的xargs列表。xargs

如果列表中的文件名不是完整的文件名,并且仅将其传递给wc还不够,因为没有可以编辑该文件的目录,因此包含完整路径(您应该能够在不手动编辑它的情况下执行此操作,通过使用sedawk或类似)。

xargs或者您可以使用( -Ioption in )中的替换字符串机制xargs(请注意,如果您使用最后一个方法,则-I每行将调用不同的程序,并且最大长度有一些限制 - 有关详细信息,请参阅手册页)

如果你的输入来自文件(因此你不能使用 选项提供的机制-0xargs,你必须非常注意文件名中是否有空格或其他奇怪的字符。如果有的话,你应该想办法避免一些意想不到的结果。

例如,如果您有一个名为“my document.txt”的文件,并且在列表中写为

my document.txt

然后它像写入文件一样被传递,你会发现它执行的是

wc my document.txt

这将导致wc程序寻找两个文件,一个名为 my,另一个名为 document.txt

你应该确保传递的是类似的东西

wc "my document.txt"

或者

wc my\ document.txt

(如果您已经在使用替换机制,第一种方法可能会更容易,如果您已经在编辑文件,则第二种方法可能更容易。)

好吧,如果可以的话,也许更容易编辑输入文件,以便每个项目由空字符分隔并-0使用xargs.

相关内容