2011-05-04 3 views
4

나는 셸에서 CSV 파일 묶음에서 NUL 문자를 찾으려고 노력 중이다. (파이썬의 CSV 가져 오기 도구가 그다지 흥미롭지는 않지만 또 다른 시간이다) 자체 :find/xargs/perl -ne의 현재 파일 이름은 무엇입니까?

find ~/path/ -name "*.csv" -print0 | \ 
xargs -n 1 -0 \ 
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}' 

제외 파일 이름이 없습니다. Allegedly 내 이 내 스크립트를 래핑하는 내재적 인 <> 연산자는 @ARGV/ARGV 파일 핸들을 사용하고 있지만 위의 어느 것도 현재 파일의 이름을 제공하지 않습니다.

위의 파일 이름 (및 이상적으로 줄 번호)은 어떻게 표시됩니까?

+0

왜'xargs를 않습니다를 -n 1'은 perl 프로세스 당 하나의 파일을 제한합니까? 만약 당신이'perl -n' 모드를 사용 중이고 매우 부적절한 일을하지 않는다면, xargs가 동일한 펄에 여러 개의 파일 이름을 줄 수 있다면 같은 행동을 할 것입니다. – aschepler

+0

죄송합니다, 거기에 왼쪽 cruft 디버깅을했다. – pauloppenheim

답변

10

$ARGV은 현재 파일의 이름이고 $.은 현재 행 번호입니다. perldoc perlvarI/O 연산자perldoc perlop에서 참조하십시오. ($.은 파일간에 재설정되지 않으며, 그 내용은 perldoc -f eof에 있습니다.)

그리고 나는 그걸로 무엇을 하려는지 완전히 확신하지 못합니다. print; 공백으로 구분 된 파일 이름 목록 (아마도 xargs -n 때문에 하나 일 것임)에 붙어있는 파일 핸들 번호를 제공 할 것이며 NUL 및 기타 잠재적으로 터미널 혼동을 포함 할 현재 줄을 줄 것입니다. 문자.

+0

문제는 join ("", @ ARGV)이 빈 문자열이라는 것입니다. 분명히 현재 파일은'shift'되어 있고 $ ARGV는 실제로 찾고있는 것을 유지합니다. 까다로운 perlses! 그리고 예, 그것은 대부분 횡설수설 적입니다, 나는 디버깅을하고있었습니다. 다시 한 번 감사드립니다! – pauloppenheim

0
이 같은

Pproceed 뭔가 (내가 여기에 "X"에 대한 파일을 통해 .pl 검색) :

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/' 
관련 문제