Nome file corrente per find / xargs / perl -ne?
Domanda
Sto lavorando nella shell, cercando di trovare caratteri NUL in un mucchio di file CSV (di cui si lamenta l'importatore CSV di Python, ma è per un'altra volta) usando il così orgoglioso-del-mio-sempre-intelligente-self:
find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'
Tranne che non vedo il nome del file. Presumibilmente l'operatore <> implicito in cui perl -ne
sta avvolgendo il mio script sta semplicemente usando @ARGV
/ il filehandle ARGV
, ma nessuno dei precedenti mi fornisce il nome del file corrente.
Come vedo il nome del file corrente (e, idealmente, il numero di riga) sopra?
Soluzione
$ARGV
è il nome del file corrente e $.
è il numero di riga corrente;vedere perldoc perlvar
e Operatori di I / O in perldoc perlop
.(Nota che $.
non si ripristina tra i file; c'è una discussione su questo in perldoc -f eof
.)
E non sono del tutto sicuro di cosa stai cercando di ottenere con quel print
;ti darà il numero del filehandle, che probabilmente è 3, anteposto a un elenco di nomi di file separati da spazi (che probabilmente dovrebbe essere solo quello a causa di xargs -n
), quindi la riga corrente che includerà il NUL
e altri potenzialmente confusi dal terminalecaratteri.
Altri suggerimenti
Procedi in questo modo (ho cercato "x" nei file .pl):
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -we 'while (<>) { print qq($ARGV\t$.\t$_) if m/x/ }'
E sì, può essere abbreviato utilizzando l'opzione -n
:
find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'