ls -R
options 을 사용하지 않고 이와 유사한 출력을 가진 쉘 스크립트를 작성하려고 합니다 -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 "/.*/.*/.*/"
이는 집에 수많은 파일이 없다고 가정할 뿐입니다! 이렇게 하면 인수 목록이 너무 길다는 오류가 발생합니다. 그러나 한 단계로 답변을 제공하는 솔루션에서는 유사한 오류가 발생할 수 있습니다. (또한 재귀 함수 호출).