Nome de arquivo atual para find / xargs / perl -ne?
Pergunta
Estou trabalhando no shell, tentando encontrar NUL chars em um monte de arquivos CSV (que o importador CSV do Python está reclamando, mas isso é para outra hora) usando o tão-orgulho-de-meu-sempre-inteligente-se:
find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'
Exceto que não vejo o nome do arquivo. Supostamente o operador <> implícito no qual perl -ne
está envolvendo meu script está apenas usando @ARGV
/ o ARGV
filehandle, mas nenhum dos itens acima está me fornecendo o nome do arquivo atual.
Como posso ver o nome do arquivo atual (e, de preferência, o número da linha) acima?
Solução
$ARGV
é o nome do arquivo atual e $.
é o número da linha atual;consulte perldoc perlvar
e Operadores de E / S em perldoc perlop
.(Observe que $.
não redefine entre os arquivos; há uma discussão sobre isso em perldoc -f eof
.)
E não tenho certeza do que você está tentando realizar com esse print
;ele lhe dará o número do identificador de arquivo, que provavelmente é 3, anexado a uma lista de nomes de arquivos separados por espaço (que provavelmente deve ser apenas um por causa de xargs -n
), a linha atual que incluirá o NUL
e outros potencialmente confusospersonagens.
Outras dicas
Proceda a algo assim (pesquisei "x" em arquivos .pl aqui):
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -we 'while (<>) { print qq($ARGV\t$.\t$_) if m/x/ }'
E sim, ele pode ser reduzido usando a opção -n
:
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'