답변:
for
루프를 사용하십시오 :
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
디렉토리의 서브 디렉토리 만 검색합니다 /path/to/dir
. 디렉토리 이름에 공백이나 특수 문자가 포함되어 있으면 위의 간단한 예가 실패합니다. 보다 안전한 방법은 다음과 같습니다.
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
또는 평범하게 bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(이와 달리 find
디렉토리에 대한 심볼릭 링크를 고려하고 숨겨진 디렉토리는 제외합니다)
find
같은 산출물을 처리하는 것과 관련된 한계와 위험을 지적하십시오 .
date +"%m%d20%Y"
| xargs echo echo $ d
date +"%m%d20%Y"
| xargs echo echo $ d 예상 결과는 모든 서브 디렉토리의 ls -ltr입니다. . 위의 루프가 작동하지 않음
나는 완전한 bash
초보자이지만 UN * X 재향 군인입니다. 의심 할 여지없이 Bash 셸 스크립팅에서이 작업을 수행 할 수 있지만 이전에는 find [-maxdepth <levels>] <start-dir> -exec <command> ;
이 작업을 수행했습니다. man find
누군가가 당신에게 그것을하는 방법을 말할 때까지 당신은 할 수 있고 놀 수 있습니다 bash
!
find
명령 을 실행하는 오버 헤드를 피합니다 .
$(find...)
것입니다 나쁜 관행 .
각 하위 디렉토리 아래에 파일 이름을 원하는 것처럼 보입니다. 는 ls -l | awk
그 파일 이름은 공백 및 / 또는 줄 바꿈을 포함하는 어떤 경우에 대한 강력한 충분하지? 아래 find
는 그들을 find
위해 가지 않는 일에도 -maxdepth
적용됩니다.
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
ls, grep 및 tr을 사용하는 것도 가능합니다
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
ls에 위의 옵션이없는 경우 du / sed를 선택기로 사용할 수도 있습니다.
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
이 예제는 숨겨진 디렉토리를 리턴하고 상위 및 현재 디렉토리를 제외시키는 것에주의해야합니다.