2011-05-04 62 views
4

我正在shell中工作,试图在一堆CSV文件中找到NUL字符(Python的CSV导入程序正在喋喋不休,但那是另一次),它使用我自豪的, self:find/xargs/perl -ne的当前文件名?

find ~/path/ -name "*.csv" -print0 | \ 
xargs -n 1 -0 \ 
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}' 

除了我看不到文件名。 据称隐含<>perl -ne正在包装我的脚本的运算符只是使用@ARGV/ARGV文件句柄,但以上都不给我当前文件的名称。

如何在上面看到当前文件名(以及理想的行号​​)?

+0

为什么'xargs的-n 1'每perl进程限制一个文件?如果您使用'perl -n'模式并且没有做任何狡猾的事情,如果xargs允许将多个文件名分配给相同的perl,则它将采取相同的行动。 – aschepler 2011-05-04 23:28:56

+0

对不起,它正在调试残留在那里。 – pauloppenheim 2011-05-05 00:11:21

回答

10

$ARGV是当前文件的名称,$.是当前行号;请参阅perldoc perlvarI/O操作员 in perldoc perlop。 (请注意,$.没有文件之间重置;还有的讨论中perldoc -f eof

而且我不完全知道你正试图与其他print实现的目标;它会为你提供一个文件句柄号,它大概是3,预先写在一个由空格分隔的文件名列表中(这可能只是因为xargs -n而导致的那个),那么当前行将包括NUL和其他潜在的终端混淆字符。

+0

问题在于,连接(“”,@ ARGV)是空字符串 - 显然当前文件首先被移位,而$ ARGV实际上确实保留了我正在寻找的内容。 Tricksy perlses!是的,这主要是胡言乱语,我正在调试。再次感谢! – pauloppenheim 2011-05-05 00:12:56

0

Pproceed这样的事情(我搜索.pl文件为 “X” 在这里):

find -type f -name \*.pl -print0 | \ 
xargs -0 \ 
perl -we 'while (<>) { print qq($ARGV\t$.\t$_) if m/x/ }' 

是的,它可以使用-n开关被缩短:

find -type f -name \*.pl -print0 | \ 
xargs -0 \ 
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/' 
相关问题