Aktueller Dateiname für find / xargs / perl -ne?
Frage
Ich arbeite in der Shell und versuche, NUL-Zeichen in einer Reihe von CSV-Dateien zu finden (über die der CSV-Importer von Python schwärmt, aber das ist ein anderes Mal), indem ich den so Stolz auf meine immer clevere verwende-selbst:
find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'
Außer ich sehe keinen Dateinamen. Angeblich verwendet der implizite <> Operator, in den perl -ne
mein Skript einwickelt, nur @ARGV
/ das ARGV
-Dateihandle, aber keiner der oben genannten Operatoren gibt mir den Namen der aktuellen Datei.
Wie sehe ich den aktuellen Dateinamen (und im Idealfall die Zeilennummer) oben?
Lösung
$ARGV
ist der Name der aktuellen Datei und $.
ist die aktuelle Zeilennummer.Siehe perldoc perlvar
und E / A-Operatoren im perldoc perlop
.(Beachten Sie, dass der $.
zwischen den Dateien nicht zurückgesetzt wird. Dies wird im perldoc -f eof
diskutiert.)
Und ich bin mir nicht ganz sicher, was Sie mit diesem print
erreichen wollen.Sie erhalten die Dateihandle-Nummer, die wahrscheinlich 3 ist, vor einer durch Leerzeichen getrennten Liste von Dateinamen (die aufgrund des xargs -n
wahrscheinlich nur diejenige sein sollten) und dann die aktuelle Zeile, die den NUL
und andere möglicherweise terminal verwirrende Elemente enthältZeichen.
Andere Tipps
Fahren Sie so fort (ich habe hier in .pl-Dateien nach "x" gesucht):
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -we 'while (<>) { print qq($ARGV\t$.\t$_) if m/x/ }'
Und ja, es kann mit dem -n
-Schalter gekürzt werden:
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'