다음과 같은 것이 있는 경우:
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))"
-n
Perl의 경우 또는 플래그를 사용할 수 있습니다 -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))