-R 없이 ls를 재귀적으로 사용

-R 없이 ls를 재귀적으로 사용

ls -Roptions 을 사용하지 않고 이와 유사한 출력을 가진 쉘 스크립트를 작성하려고 합니다 -R.

-R이는 프로그래밍 과제의 일부이므로 , find및 을(를) 사용할 수 없습니다 du. 전체 홈 디렉토리에서 상위 5개의 파일/디렉토리를 식별하고 총 디렉토리와 파일 수를 표시해야 합니다.

처음 5개 파일을 가져오는 데 사용할 수 있다는 것을 알고 있지만 {sort -n | tail -n}options 을 사용하지 않고 필터링되지 않은 모든 파일 및 디렉터리 목록을 반복적으로 가져오는 방법을 알 수 없습니다 -R.

답변1

재귀를 수행하는 명령에 의존하기보다는 재귀 스크립트를 직접 작성해야 하는 것처럼 들립니다.

이것이 그러한 기능의 뼈대입니다. 여러분이 채울 수 있도록 빈 부분을 남겨두었습니다.

listAllFiles() {
    local dir=$1
    local file

    for file in "$dir"/*; do
        if <$file is a directory>; then
            listAllFiles "$file"
        else
            <print $file>
        fi
    done
}

높은 수준에서 함수는 디렉터리를 첫 번째 인수로 사용합니다. 해당 디렉토리의 내용을 반복합니다. 하위 디렉터리를 찾으면 자신을 호출합니다. 그렇지 않으면 찾은 내용을 인쇄합니다. 이는 결국 디렉토리 구조를 통해 반복됩니다.

ls -R또는 기타 내장 명령을 사용하는 것처럼 이 기능을 사용할 수 있습니다 find. 결과를 변수에 저장할 수 있습니다.

allFilesInCurrentDirectory=$(listAllFiles .)

또는 파이프라인에서 사용할 수 있습니다.

listAllFiles ~/ | cmd1 | cmd2

답변2

bash를 명시적으로 지정하지 않았으므로 매우 간단한 zsh 솔루션을 자유롭게 제공할 수 있습니다.

ls -d ~/**/*| egrep -v "/.*/.*/.*/"

도트 파일도 포함하려면 다음을 수행하세요.

ls -d ~/**/*(D)| egrep -v "/.*/.*/.*/"

이는 집에 수많은 파일이 없다고 가정할 뿐입니다! 이렇게 하면 인수 목록이 너무 길다는 오류가 발생합니다. 그러나 한 단계로 답변을 제공하는 솔루션에서는 유사한 오류가 발생할 수 있습니다. (또한 재귀 함수 호출).

관련 정보