【问题标题】:Current filename for find/xargs/perl -ne?find/xargs/perl -ne 的当前文件名?
【发布时间】:2011-08-18 22:59:10
【问题描述】:

我在 shell 中工作,尝试使用 so-proud-of-my-ever-clever 在一堆 CSV 文件(Python 的 CSV 导入器正在考虑,但那是另一次)中找到 NUL 字符-自我:

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

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

我如何在上面看到当前文件名(最好是行号)?

【问题讨论】:

  • 为什么xargs -n 1 限制每个 perl 进程一个文件?如果您使用perl -n 模式并且没有做任何非常偷偷摸摸的事情,那么如果 xargs 允许为同一个 perl 提供多个文件名,它的行为也会相同。
  • 抱歉,里面有调试垃圾。

标签: perl xargs perlvar


【解决方案1】:

$ARGV是当前文件名,$.是当前行号;参见perldoc perlvar 和perldoc perlop 中的I/O 运算符。 (请注意,$. 不会在文件之间重置;perldoc -f eof 对此进行了讨论。)

我不完全确定你想用 print 完成什么;它会为您提供文件句柄编号,可能是 3,添加到以空格分隔的文件名列表之前(由于xargs -n,这可能只是一个),然后是当前行,其中将包括NUL 和其他可能会混淆终端的字符。

【讨论】:

  • 问题是 join(" ",@ARGV) 是空字符串 - 显然当前文件首先是 shifted ,并且 $ARGV 实际上包含我正在寻找的内容。棘手的错误!是的,这主要是胡言乱语,我正在调试。再次感谢!
【解决方案2】:

进行类似的操作(我在 .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/'

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2016-05-08
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多