Nom de fichier actuel pour trouver / xargs / perl -ne?
Question
Je travaille dans le shell, essayant de trouver NUL Chars dans un tas de fichiers CSV (que l'importateur CSV de Python se réjouit, mais c'est pour une autre fois) en utilisant le So-Proud-of My-ever-Clever-Self:
find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'
Sauf que je ne vois aucun nom de fichier. Prétendument l'opérateur implicite <> perl -ne
Emballage mon script est juste en utilisant @ARGV
/ la ARGV
FileHandle, mais aucun des éléments ci-dessus ne me donne le nom du fichier actuel.
Comment voir le nom de fichier actuel (et, idéalement, le numéro de ligne) ci-dessus?
La solution
$ARGV
est le nom du fichier actuel et $.
est le numéro de ligne actuel; voir perldoc perlvar
et Opérateurs d'E / S dans perldoc perlop
. (Notez que $.
ne réinitialise pas les fichiers; il y a une discussion à ce sujet dans perldoc -f eof
.)
Et je ne suis pas tout à fait sûr de ce que vous essayez d'accomplir avec ça print
; Il vous donnera le numéro de filehandle, qui est probablement 3, apparenté à une liste de noms de fichiers séparés par l'espace (qui ne devrait probablement être que celui à cause de xargs -n
), puis la ligne actuelle qui comprendra le NUL
et d'autres caractères potentiellement terminaux.
Autres conseils
Pproceeple quelque chose comme ça (j'ai recherché des fichiers .pl pour "x" ici):
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -we 'while (<>) { print qq($ARGV\t$.\t$_) if m/x/ }'
Et oui, il peut être raccourci en utilisant le -n
changer:
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'