while read방법(순수한 bash)

while read방법(순수한 bash)

명령 실행 결과를 기반으로 텍스트 스트림을 필터링하는 표준 도구가 있습니까?

grep예를 들어 이것을 고려하십시오. 정규식을 기반으로 텍스트 스트림을 필터링할 수 있습니다. 그러나 더 일반적인 문제는 필터를 확장하는 것입니다. 예를 들어, 특정 기준과 일치하는 모든 파일을 선택하거나( find사용 가능한 검사가 엄청나게 많지만 어쨌든 하위 집합임) 다른 프로그램을 사용하여 데이터를 필터링할 수 있습니다. 다음 파이프라인을 고려해보세요.

produce_data | xargs -l bash -c '[ -f $0 ] && ping -c1 -w1 $1 && echo $0 $@'

전혀 쓸모가 없지만 일반적인 접근 방식을 제공합니다. bash oneliner를 사용하여 각 줄을 테스트할 수 있습니다. 이 예에서는 기존 파일과 액세스 가능한 호스트로 구성된 행을 원합니다. 나는 이 작업을 수행하는 표준 도구를 원합니다.

produce_data | super_filter -- bash -c '[ -f $0 ] && ping -c1 -w1 $1'

다음과 함께 쉽게 사용할 수 있습니다 find.

find here | super_filter -- test -r

find제가 항상 잊어버린 특정 플래그 대신 일반 도구를 사용하여 파일을 필터링하는 방법에 주목하세요 .

보다 현실적인 예는 특정 기호가 포함된 개체 파일을 찾는 것입니다. 이러한 도구는 도움이 될 것입니다.

따라서 super_filter모든 조건 검사기는 스트리밍 모드에서 실행될 수 있습니다. 구문은 in xargs또는 와 유사할 수 있습니다 parallel.

답변1

추가하면 GNU 병렬이 작동하지 않습니까 && echo?

... | parallel 'test -r {} && echo {}'

답변2

while read방법(순수한 bash)

while read입력을 한 줄씩 처리하기 위한 일반적인 관용어입니다(파일의 줄을 반복하는 방법은 무엇입니까?). echo원래 입력 라인에 대한 검사 및 조건부 작업을 수행합니다.

... | while IFS= read -r line; do test -r "$line" && echo "$line"; done

특별한 경우:find

찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?

find-exec임의의 작업을 수행하고 발견된 파일을 확인하는 작업이 있습니다 .

에서 man find:

-exec command ;
   Execute  command;  true  if 0 status is returned.  All following arguments to
   find are taken to be arguments to the command until an argument consisting of
   `;' is encountered.  The string `{}' is replaced by the current file name be‐
   ing processed everywhere it occurs in the arguments to the command, not  just
   in  arguments  where it is alone, as in some versions of find.  Both of these
   constructions might need to be escaped (with a `\') or quoted to protect them
   from  expansion  by  the shell.  See the EXAMPLES section for examples of the
   use of the -exec option.  The specified command is run once for each  matched
   file.  The command is executed in the starting directory.  There are unavoid‐
   able security problems surrounding use of the -exec action;  you  should  use
   the -execdir option instead.

예:

find here -exec test -r {} \; -print

-exec작업은 기본 -print작업을 재정의 하므로 -print명시적으로 지정해야 합니다. 이 동작은 find(1) 매뉴얼 페이지의 EXPRESSION 섹션에 설명되어 있습니다. 추가 처리를 적용하려면 대신 -print0+를 사용하세요 .xargs --null-print

관련 정보