전체 시스템에 있는 모든 Python 및 쉘 스크립트를 어떻게 계산할 수 있습니까?

전체 시스템에 있는 모든 Python 및 쉘 스크립트를 어떻게 계산할 수 있습니까?

전체 시스템에 있는 모든 Python 및 쉘 스크립트를 어떻게 계산할 수 있습니까?

답변1

더 구체적인 목표가 없으면 쉘 스크립트를 구성하는 요소와 Python 스크립트를 구성하는 요소에 대한 모호함으로 인해 어떻게 하든 대략적인 목표가 됩니다. 그렇다고 해서 문제가 너무 잘못 정의된 것은 아닙니다.근사치가 원하는 한. 그리고 당신은 좋은 근사치를 얻을 수 있습니다.

이를 고려하여 쉘 및 Python 스크립트를 나열하려면 다음 명령을 제안합니다.

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,'

출력이 요구 사항에 적합해 보이면 다시 실행하여 결과 수를 계산하도록 수정할 수 있습니다.

find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,' | wc -l

'권한 거부됨' 오류가 발생할 수 있습니다. 괜찮아요. 관심 있는 파일이나 위치에 액세스할 수 없는 것처럼 보이는지 확인하려면 해당 오류 메시지를 읽거나 최소한 검색해야 하기 때문에 해당 오류 메시지를 표시하지 않는 것이 좋습니다. 정말로 원한다면 find루트로 명령을 실행할 수 있습니다 .sudo

  • -type f일반 파일만 찾게 만듭니다. 일반적으로 일반 파일을 확인하는 기호 링크를 포함하는 것이 더 좋지만 -xtype f이 경우 초과 계산이 발생합니다.
  • -executable를 실행하는 사용자가 실행할 수 있는 파일만 찾도록 합니다 find. 실행할 수 없는 파일이 셸이나 Python 스크립트로 나타나는지 확인하면 명령 실행 시간이 상당히 길어집니다. 실행 가능하지 않은 파일이 스크립트가 아니라 "라이브러리"일 수 있다는 점에서 그런 식으로 더 많은 거짓 긍정을 얻을 수도 있습니다. 즉, 해당 파일은 셸 명령으로 구성될 수 있고 셸 스크립트를 사용하거나 셸 스크립트로 소싱하기 위한 것일 수도 .있고 source, Python 프로그램과 함께 import또는 Python 프로그램으로 가져올 Python 모듈입니다 from. (그러한 파일에는 일반적으로오두막, 그러나 findshebang 이상의 것을 찾습니다.) 그러나 -executable원하는 경우 생략할 수 있습니다.기다릴 의향이 있다면명령은 시스템의 모든 일반 파일의 시작 부분을 열고 읽으려고 시도합니다.
  • -exec ... +...발견된 파일을 명령줄 인수로 사용하여 명령을 실행합니다 . 모든 파일을 처리하는 데 필요한 만큼 명령을 실행합니다. 종종 이것은 한 번만 발생합니다. 전체 시스템의 모든 실행 파일에 대해 두 번 이상일 가능성이 높지만 파일당 한 번 실행하는 것보다 횟수가 훨씬 적습니다 -exec ... \;. 동일한 수의 파일에서도 명령을 더 적게 실행하는 것이 더 많이 실행하는 것보다 훨씬 더 빠른 경향이 있습니다. 관련 오버헤드가 낮기 때문입니다.
  • file명령은 파일의 시작 부분을 보고 일반적으로 해당 파일이 어떤 종류인지 추측합니다. 왼쪽에 경로 또는 파일 이름과 내용 요약이 포함된 2열 형식으로 출력됩니다.친절한파일의 오른쪽에 있는 것 같습니다.
  • grep명령은 입력을 필터링하고 대소문자를 구분하지 않고( -i) 일치하는 행만 출력합니다.확장 정규식( -E) (python|shell) script,. 이는 텍스트 또는 대소문자 변형을 포함하는 행 python script,입니다 shell script,. 파일은 find해당 유형의 스크립트를 식별하여 이를 표시합니다.
  • wc -l위에 표시된 두 명령 중 두 번째에 나타나는 는 줄 수를 계산합니다.

표시된 바와 같이 이 기술은 다음과 같은 경우에는 전혀 적합하지 않습니다.많은어떤 유형의 파일이 있는지 식별하는 작업.그 이유는 파일 python script,이름에 같은 텍스트가 포함될 수 있을 뿐만 아니라 이름에 개행 문자가 있어서 출력이 file한 줄에 하나씩 표시되지 않을 수 있기 때문입니다.그러한 일을 설명하는 것은 일반적으로 중요하며 때로는 매우 중요하며, 그렇게 할 수 있습니다.하지만 이 경우에는 (문제 자체의 모호한 특성으로 인해) 추정만 하고 있으며 결과를 직접적으로 기반으로 이름을 바꾸거나, 수정하거나, 삭제하거나, 아무것도 생성하지 않는 것으로 보입니다. 그것에 대해 걱정할 가치가 없다고 생각합니다. 이를 반복하고 문제를 보다 엄격하게 정의한다면 이를 해결하는 것이 가치가 있을 수 있습니다.

실행 불가능한 파일을 스크립트로 간주하려는 주요 경우가 하나 있습니다. Windows와 같은 시스템에서 실행 파일로 표시되지 않은 Python 스크립트를 가져온 경우입니다. 이 경우 .py파일을 검색할 수 있지만 그 중 상당수는 Python 스크립트가 아닌 Python 모듈일 가능성이 높습니다. 스크립트 상단에 해시뱅을 배치하는 좋은 Python 관행을 따른 경우( 불행히도 항상 수행되는 것은 아니지만 이를 인식 py.exe하고 인식하기 때문에 Windows에서도 유용합니다), 해시뱅만 검색하지만 다음과 같은 경우 무시하는 기술입니다. pyw.exe실행 가능한 파일이 귀하의 요구에 더 적합할 수 있습니다.

실행 불가능한 파일을 모든 종류의 스크립트로 간주하려는 사소하지만 중요한 경우도 있습니다. 더 정확하게는 실행 가능성을 다르게 테스트하려는 경우도 있습니다. 드라이브가 마운트되어 있으면 noexec그 안에 있는 어떤 파일도 의 테스트 find를 통과하지 못할 것입니다 -executable. 이는 일부 파일을 실행할 권한이 없는 사용자로 실행하는 것과는 다른 문제입니다 find. 예를 들어 일부 디렉터리를 볼 수 있는 권한이 없는 사용자로 실행하는 문제는 다음과 같이 해결할 수 있습니다. 충분한 권한이 있는 사용자로 실행합니다.


이 문제,당신이 제기한 대로, 특이해요--일반적으로 특정 언어의 스크립트나 밀접하게 관련된 언어의 소규모 계열을 찾고 싶을 것입니다.. 그러나 미래의 독자들을 위해 위 명령을 약간 수정하면 하나의 대규모 디렉토리에서 모든 (예를 들어) 쉘 스크립트를 찾을 수도 있다는 점에 유의하십시오. (에 제시된 기술에 대해서도 동일하게 적용됩니다.WinEunuuchs2Unix의 답변--그것도 유용합니다.)

예를 들어, 현재 디렉토리에서 모든 쉘 스크립트를 찾으려면 다음을 수행하십시오.

find . -type f -executable -exec file {} + | grep -Fi 'shell script,'

답변2

빠른 개요

이를 수행하는 방법에 대한 지침은 다음과 같습니다.

$ for f in * ; do file "$f" ; done

aptfielout: ASCII text, with very long lines
aptfilein: ASCII text, with very long lines
aptfileout: ASCII text
aptfileparse.sh: Bourne-Again shell script, ASCII text executable, with very long lines
aptfileparse.sh~: ASCII text, with very long lines
calc.py: Python script, UTF-8 Unicode text executable
catall.sh: Bourne-Again shell script, ASCII text executable

"Bourne-Again 쉘 스크립트" 또는 "Python 스크립트"가 아닌 모든 파일을 제거하십시오. POSIX 쉘 스크립트 목록에 추가하십시오:

$ file /bin/zgrep
/bin/zgrep: POSIX shell script, ASCII text executable

완전한 답변

/$ time find * -type f -print0 2>/dev/null | xargs -0 -P 8 file | \
sed 's/.*: //g' | sed 's/^ *//g' | \
grep -Eio 'shell script,|Python script,' | sort | uniq -c  

  19151 Python script,                  
    127 python script,
  18420 shell script,

real    16m14.939s
user    54m7.355s
sys     2m33.238s

루트( /) 부터 시작하여 find모든 파일과 파이프는 xargs0바이트로 끝나는 이름으로 명령에 연결됩니다.

xargs명령은 더 빠른 처리를 위해 8개의 CPU를 모두 최대화하면서 병렬로 실행됩니다. 각 병렬 프로세스는 file이전 섹션에 표시된 대로 파일에 대한 설명을 가져오는 명령을 호출합니다.

grep명령은 쉘 스크립트와 Python 스크립트를 선택합니다.

sort명령은 쉘 스크립트를 함께 정렬하고 Python 스크립트를 함께 정렬합니다.

uniq명령은 각 그룹의 발생 횟수를 계산합니다.


재미있는 사실

내 경우에는 8개의 CPU를 모두 동시에 실행하는 시스템에 큰 부담을 줄 수 있습니다.

xargs 8 cores.gif 찾기

리눅스의 아름다움이 빛을 발하는 이유는 화면 녹화, .gif세 번째 모니터(대형 스크린 TV)에서 실행되는 영상 등 다른 작업도 계속해서 정상적으로 작동하기 때문이다. Linux에서는 xargs file명령이 시스템을 중단시키는 것을 허용하지 않습니다 .

관련 정보