for 루프에서 각 디렉토리를 반복하는 올바른 방법은 무엇입니까? [복사]

for 루프에서 각 디렉토리를 반복하는 올바른 방법은 무엇입니까? [복사]

예를 들어, 이 for 루프에서는

for var in ?????
do
    dummy command
done

나는 현재 있는 디렉터리의 모든 디렉터리를 반복할 수 있기를 원하지만 이는 알 수 없는 디렉터리 목록이므로 물음표가 있는 위치에 각 디렉터리를 쓸 수는 없습니다. 도움을 주시면 감사하겠습니다.

답변1

가장 간단한 것은 귀하의 요구 사항을 충족시키는 것입니다."현재 내가 있는 디렉토리의 모든 디렉토리를 반복합니다.", 와일드카드만 사용하세요.

for d in */
do
    dummy_command "$d"
done

명령이 후행 슬래시를 처리할 수 없는 경우 $d로 바꿔 제거할 수 있습니다."$d""${d%/}"

명령이 여러 인수를 허용할 수 있으면 루프를 전혀 반복할 필요가 없습니다.

dummy_command */

dummy_command테스트의 예는 간단할 수 있습니다 echo.

알아채다모든 경우에 패턴이 일치하지 않으면 */문자 그대로 별표와 슬래시로 명령에 전달됩니다. 이것은 거의 확실히 당신이 원하는 것이 아닙니다.

루프 위에 이 줄을 추가하면 문제를 해결할 수 있지만 bash그 지점부터 적용된다는 점에 유의하세요.

shopt -s nullglob    # Expand unmatched wildcards to "nothing"

...상대편이 생기 shopt -u nullglob거나 스크립트가 끝날 때까지

답변2

최소/최대 깊이와 같은 항목을 더 자세히 제어하려면 while 루프에서 find를 사용할 수 있습니다.

while IFS= read -r dir; do
    echo "$dir"
done < <(find . -type d)

그런 다음 필요에 맞게 조회 옵션을 변경하면 됩니다. 공백이 있는 디렉토리 이름을 찾는 것처럼 할 수 있습니다.find . -type d -name '* *'

답변3

다음과 같이(파일 이름에 공백이 포함된 디렉터리를 반복적으로 나열합니다):

shopt -s globstar
dummy_command **/*' '*/

또는 for 루프 사용을 고집하는 경우:

shopt -s globstar
for dir in **/*' '*/
    dummy_command "$dir"
done

관련 정보