글쎄, 이것을 중복으로 즉시 종료하기 전에 설명하겠습니다. 나는 다음과 같은 많은 방법을 시도했습니다.
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
~처럼제프 샬러는 다음과 같이 지적합니다.,
*
일반적으로 다음과 같이 작동합니다ls
. 다음으로 끝나는 이름은 표시되지 않습니다..
(일정 기간). bash를 사용하고 있고 이름을 가져오려는 경우.
, 에스등 (열기)쉿엘자선택하다이온dotglob
과 명령shopt -s dotglob
*
이로 인해 다음과 같은 작업이 발생합니다ls -A
. 여전히 표시되지 않습니다..
그리고..
그 자체이지만 다음과 같이 표시됩니다..
.귀하의 질문에 "디렉토리의 모든 것"이 언급되어 있습니다. 다소 모호한 표현입니다.
/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
.예를 들어 다음과 같이 여러 옵션을 동시에 설정할 수 있습니다.
shopt -s dotglob globstar
전체 옵션 목록은 bash 설명서를 참조하세요. 당신은 할 수너nset 옵션은
shopt -u
."$file"
타당한 이유가 없고 수행 중인 작업을 확실히 알고 있는 경우가 아니면 항상 모든 셸 변수 참조(예: )를 인용해야 합니다 .
답변4
이 형식을 사용하면 "ls"의 모든 목록 및 정렬 옵션 중에서 선택할 수 있습니다.
ls -at $DIR | while read i; do echo $i; done