Текущее имя файла для find / xargs / perl -ne? - PullRequest
4 голосов
/ 05 мая 2011

Я работаю в оболочке, пытаюсь найти NUL-символы в куче CSV-файлов (о которых сейчас мечтает импортер CSV в Python, но уже в другой раз), используя метод «гордый своим когда-либо умным» -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 ]

10 голосов
/ 05 мая 2011

$ARGV - имя текущего файла, а $. - номер текущей строки; см. perldoc perlvar и Операторы ввода / вывода в perldoc perlop. (Обратите внимание, что $. не сбрасывается между файлами; об этом говорится в perldoc -f eof.)

И я не совсем уверен, чего вы пытаетесь достичь с помощью этого print; он даст вам номер дескриптора файла, который, вероятно, равен 3, с добавлением к пробелу списка имен файлов (который, вероятно, должен быть только один из-за xargs -n), затем текущей строки, которая будет включать NUL и другие потенциально вводящие в заблуждение символы.

0 голосов
/ 05 мая 2011

P Выполните что-то вроде этого (я искал .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/'
...