Perl oneliner에 파이프 변수 전달

Perl oneliner에 파이프 변수 전달

다음과 같은 것이 있는 경우:

find . -d -maxdepth 1 | wc -l | perl ...

Perl에게 이 들어오는 변수를 가져와서 1을 빼도록 지시하는 방법은 무엇입니까?

1을 너무 많이 계산해서 1을 빼려고 했습니다.

답변1

Perl은 여기서 과잉입니다.

find . -maxdepth 1 -mindepth 1 | wc -l

( 일부 파일 이름에 개행 문자가 포함되는 것을 방지하는 grep -c /것보다 사용하는 것이 더 좋습니다.)wc -l

또는 GNU를 사용하십시오 ls:

ls -A | wc -l

그리고 zsh:

f=(*(D))
echo $#f

하나를 삭제하려면:

... | tail -n +2 | wc -l

또는:

n=$(... | wc -l); echo "$(($n - 1))"

-nPerl의 경우 또는 플래그를 사용할 수 있습니다 -p.

... | perl -lpe '--$_'

위의 표현식이 평가되고 --$_변수의 내용이 각 입력 줄에 대해 인쇄됩니다.$_

답변2

잘못된 대답을 한 이유가 있습니다. 이 경우 find 출력의 마지막 줄인 단일 점 선으로 표시된 것처럼 나열된 디렉터리 자체를 보기보다는 디렉터리 항목 수를 계산하기를 바랍니다.

해결책은 "wc -l"에서 계산해서는 안 되는 항목을 숨기는 것입니다.

find .  -depth -maxdepth 1 | grep -v "^\.$" | wc -l

grep은 줄 수를 계산할 수 있으므로 이를 사용하여 추가 실행 파일을 시작할 필요성을 줄일 수 있습니다.

find . -depth -maxdepth 1 | grep -vc "^\.$"

발견된 항목 수는 깊이를 먼저 통과하는지 여부에 따라 변경되지 않으므로 해당 옵션을 제거하여 다음을 얻을 수 있습니다.

find . -maxdepth 1 | grep -vc "^\.$"

답변3

나는 다른 답변에 동의합니다. Perl은 당신이 찾고 있는 것보다 과잉입니다. 즉, bash 변수를 Perl에 전달하는 데는 확실히 타당한 이유가 있습니다. 다음과 같이 내보내기 및 Perl 환경 변수를 사용합니다.

# i=$(find . -d -maxdepth 1 | wc -l) ; export i=$i ; perl -le 'print "Removing one from  $ENV{i} for ".($ENV{i}-=1)'; unset i 

쉘에 대한 수치 솔루션:

# i=$(find . -d -maxdepth 1 | wc -l) ; echo i=$((i-1))

관련 정보