디렉터리의 모든 항목을 반복하시겠습니까?

디렉터리의 모든 항목을 반복하시겠습니까?

글쎄, 이것을 중복으로 즉시 종료하기 전에 설명하겠습니다. 나는 다음과 같은 많은 방법을 시도했습니다.

for d in /Applications ; do
   echo "$d"
done

하지만 이것은 반환

/애플리케이션

/Applications의 내용이 아니라.

나는 또한 다음을 시도했습니다.

#!/bin/bash
FILES=/Applications

for file in $FILES
do
   echo $file
done

기본적으로는 똑같습니다. 그러나 이 작업을 수행할 때 다음과 같은 사실을 발견했습니다.

#!/bin/bash

for file in *
do
    echo $file
done

내 홈 폴더의 모든 폴더를 올바르게 반영합니다. 무슨 일인지 아는 사람 있나요?

답변1

이를 *쉘 글로빙(경로 이름 확장) 연산자( ?또한 [])라고 하며, 따옴표 없이 호출하면 현재 디렉터리의 모든 파일(디렉터리 접두사 없이)로 확장됩니다. 예를 들어 접두사를 사용하면 /foo/*디렉터리의 모든 파일로 확장됩니다 /foo.

특정 파일을 일치시키는 데에도 사용됩니다. 예를 들어 foo현재 디렉터리로 시작하고 끝나는 파일만 일치하려면 glob 패턴을 사용하세요.bar

foo*bar

따라서 for루프는 이제 다음과 같은 형식을 취할 수 있습니다.

for f in foo*bar; do echo "$f"; done

man쉘 와일드카드에 대한 자세한 내용은 쉘 페이지를 읽어보세요 .

답변2

디렉토리의 파일(및 하위 디렉토리)을 반복하려면 다음을 사용할 수 있습니다.

for file in /Applications/*
do
    echo "$file"
done

일치하는 항목이 없으면 file변수에 /Applications/*리터럴 문자열(별표 포함)이 포함되며, 다음 명령에 기존 경로가 필요한 경우 오류가 발생할 수 있습니다. 파일 일치 없이 아무 작업도 수행하지 않으려면 다음 nullglob옵션을 사용할 수 있습니다.

shopt -s nullglob
for file in /Applications/*
do
    echo "$file"
done

답변3

  1. ~처럼제프 샬러는 다음과 같이 지적합니다., *일반적으로 다음과 같이 작동합니다 ls. 다음으로 끝나는 이름은 표시되지 않습니다..(일정 기간). bash를 사용하고 있고 이름을 가져오려는 경우., 에스등 (열기)엘자선택하다이온 dotglob과 명령

    shopt -s dotglob
    

    *이로 인해 다음과 같은 작업이 발생합니다 ls -A. 여전히 표시되지 않습니다..그리고..그 자체이지만 다음과 같이 표시됩니다...

  2. 귀하의 질문에 "디렉토리의 모든 것"이 언급되어 있습니다. 다소 모호한 표현입니다. /Applications(최상위) 디렉토리의 모든 것을 의미한다면 다른 답변은 괜찮습니다. 하지만 그 안에 모든 것을 담고 싶다면/Applications 나무 (즉, /Applications디렉토리의 모든 것및 해당 하위 디렉터리globstar), bash를 사용하는 경우 다음 명령을 사용하여 쉘 옵션을 설정하십시오.

    shopt -s globstar
    

    이로 인해** 파일 이름의 일부로여기와 아래의 모든 것을 의미합니다. 그래서

    for file in /Applications/**
    do
        echo "$file"
    done
    

    디렉터리(파일, 디렉터리 등)의 모든 개체를 나열합니다./Applications 나무.

    동일한 구성 요소 수준의 다른 캐릭터와 결합할 수 없습니다. 즉, 유사한 작업을 수행할 수 없습니다 foo**bar. 그러나 예를 들어 다음과 같이 할 수 있습니다 **.

    for file in /Applications/**/README
    

    README트리 에 이름이 지정된 모든 파일을 반복합니다 /Applications.

    for file in /Applications/**/*.txt
    

    로 끝나는 모든 이름을 찾습니다 .txt.

  3. 예를 들어 다음과 같이 여러 옵션을 동시에 설정할 수 있습니다.

    shopt -s dotglob globstar
    

    전체 옵션 목록은 bash 설명서를 참조하세요. 당신은 할 수nset 옵션은 shopt -u.

  4. "$file"타당한 이유가 없고 수행 중인 작업을 확실히 알고 있는 경우가 아니면 항상 모든 셸 변수 참조(예: )를 인용해야 합니다 .

답변4

이 형식을 사용하면 "ls"의 모든 목록 및 정렬 옵션 중에서 선택할 수 있습니다.

ls -at $DIR | while read i; do echo $i; done

관련 정보