find / xargs / perl -ne的当前文件名?

时间:2011-05-04 23:18:28

标签: perl xargs perlvar

我正在使用shell,试图在一堆CSV文件中找到NUL字符(Python的CSV导入器正在喋喋不休,但那是另一次)使用我这么自豪的聪明人-self:

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

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

如何查看上面的当前文件名(以及理想情况下的行号)?

2 个答案:

答案 0 :(得分:10)

$ARGV是当前文件的名称,$.是当前行号;请参阅perldoc perlvar中的perldoc perlop I / O操作员。 (请注意,$.不会在文件之间重置;在perldoc -f eof中会对此进行讨论。)

我并不完全确定你要用print完成什么。它会给你一个文件句号,大概是3,前面是一个以空格分隔的文件名列表(可能只是因为xargs -n的那个),然后是当前行,它将包含{{1和其他潜在的终端混淆字符。

答案 1 :(得分: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/'