Bash의 재귀 무한 루프

Bash의 재귀 무한 루프

디렉토리에서 특정 이름을 가진 모든 파일을 검색하고 ls -l을 적용하여 크기를 확인하고 싶습니다. 먼저 이것을 사용했지만 find . -name .ycm* | ls -l작동하지 않습니다. 설명은 다음에서 얻었습니다.이 링크.

ls -l그런 다음 디렉터리를 반복적으로 탐색하고 파일 이름을 검색하고 해당 파일에 대해 작업을 수행하거나 다른 명령을 실행하는 스크립트를 생성하려고 합니다 .

다음 스크립트를 사용했지만 첫 번째 호출 자체에서 멈춰서 계속 호출하고 있는 것으로 나타났습니다.

#!/bin/bash
for_count=0 
file_count=0
dir_count=0
search_file_recursive() {
    # this function takes directory and file_name to be searched 
    # recursively
    # :param $1 = directory you want to search
    # :param $2 = file name to be searched

    for file in `ls -a `$1``:
    do
        let "for_count=for_count+1"
        echo "for count is  $for_count"
        # check if the file name is equal to the given file
        if test $file == $2 
        then
            ls -l $file
            let "file_count++"
            echo "file_count is $file_count"
        elif [ -d $file ] && [ $file != '.' ] && [ $file != '..' ]
        then
            echo "value of dir = $1 , search = $2, file = $file"
            search_file_recursive $file $2
            let "dir_count++"
            echo "directory_count is $dir_count"
        fi
    done
    return  0
}

search_file_recursive $1 $2

이것은 에코가 없는 내 출력의 모습입니다.

 anupam  …  YouCompleteMe  third_party  ycmd   ae8a33f8 … 5  ./script.sh pwd .ycm_extra_conf.py 
Segmentation fault: 11
 anupam  …  YouCompleteMe  third_party  ycmd   ae8a33f8 … 5  echo $?
139

답변1

GNU를 사용하여 find파일 이름이 패턴과 일치하는 일반 파일의 크기(바이트)를 얻으려면 .ycm*다음을 수행할 수 있습니다.

find . -type f -name '.ycm*' -printf '%s\t%p\n'

그러면 크기가 인쇄되고 그 뒤에 탭 문자와 파일의 경로 이름이 표시됩니다. 명령줄에서 쉘 글로빙 패턴으로 사용하지 않으려면 파일 이름 패턴의 인용에 유의하세요.

다음은 stat유사한 방식으로 각 파일에 대해 외부 명령을 사용합니다(Linux에만 해당).

find . -type f -name '.ycm*' -exec stat --printf '%s\t%n\n' {} +

다음은 BSD 시스템(예: macOS)에 적용됩니다.

find . -type f -name '.ycm*' -exec stat -f '%z%t%N' {} +

BSD stat형식 문자열 에서는 %z바이트 단위의 크기로 대체되고 %t탭 문자로 대체되며 %N파일의 경로 이름으로 대체됩니다.

또한보십시오:

관련 정보