我知道还有其他方法可以解决此问题,但我希望能够将wc
stdin 解释为文件名或文件名列表。例如,
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
还不够,因为没有可以编辑该文件的目录,因此包含完整路径(您应该能够在不手动编辑它的情况下执行此操作,通过使用sed
或awk
或类似)。
xargs
或者您可以使用( -I
option in )中的替换字符串机制xargs
(请注意,如果您使用最后一个方法,则-I
每行将调用不同的程序,并且最大长度有一些限制 - 有关详细信息,请参阅手册页)
如果你的输入来自文件(因此你不能使用 选项提供的机制-0
)xargs
,你必须非常注意文件名中是否有空格或其他奇怪的字符。如果有的话,你应该想办法避免一些意想不到的结果。
例如,如果您有一个名为“my document.txt”的文件,并且在列表中写为
my document.txt
然后它像写入文件一样被传递,你会发现它执行的是
wc my document.txt
这将导致wc
程序寻找两个文件,一个名为 my,另一个名为 document.txt
你应该确保传递的是类似的东西
wc "my document.txt"
或者
wc my\ document.txt
(如果您已经在使用替换机制,第一种方法可能会更容易,如果您已经在编辑文件,则第二种方法可能更容易。)
好吧,如果可以的话,也许更容易编辑输入文件,以便每个项目由空字符分隔并-0
使用xargs
.