[bash] Bash를 사용하여 모든 하위 디렉토리에서 작업 수행

특정 폴더의 모든 하위 디렉토리에서 작업을 수행 해야하는 스크립트를 작성 중입니다.

그것을 작성하는 가장 효율적인 방법은 무엇입니까?



답변

for D in `find . -type d`
do
    //Do whatever you need with D
done


답변

하위 프로세스 작성을 피하는 버전 :

for D in *; do
    if [ -d "${D}" ]; then
        echo "${D}"   # your processing here
    fi
done

또는 작업이 단일 명령 인 경우 더 간결합니다.

for D in *; do [ -d "${D}" ] && my_command; done

또는 훨씬 더 간결한 버전 ( @enzotib 덕분에 ). 이 버전에서 각 값에는 D슬래시가 있습니다.

for D in */; do my_command; done


답변

가장 간단한 비 재귀 방법은 다음과 같습니다.

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

/끝에 만 사용 디렉토리 알려줍니다.

필요가 없습니다

  • 찾기
  • 어 wk

답변

find명령을 사용하십시오 .

GNU에서는 매개 변수 find를 사용할 수 있습니다 -execdir.

find . -type d -execdir realpath "{}" ';'

또는 -exec매개 변수 를 사용하여 :

find . -type d -exec sh -c 'cd -P "$0" && pwd -P' {} \;

또는 다음 xargs명령으로

find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'

또는 for 루프를 사용하십시오.

for d in */; { echo "$d"; }

재귀의 경우 확장 글러브 ( **/)를 대신 사용하십시오 (:로 활성화 shopt -s extglob).


자세한 예 는 각 디렉토리로 이동하여 명령을 실행하는 방법을 참조하십시오. 그래서


답변

편리한 원 라이너

for D in *; do echo "$D"; done
for D in *; do find "$D" -type d; done ### Option A

find * -type d ### Option B

옵션 A는 사이에 공백이있는 폴더에 적합합니다. 또한 폴더 이름의 각 단어를 별도의 엔티티로 인쇄하지 않기 때문에 일반적으로 더 빠릅니다.

# Option A
$ time for D in ./big_dir/*; do find "$D" -type d > /dev/null; done
real    0m0.327s
user    0m0.084s
sys     0m0.236s

# Option B
$ time for D in `find ./big_dir/* -type d`; do echo "$D" > /dev/null; done
real    0m0.787s
user    0m0.484s
sys     0m0.308s


답변

find . -type d -print0 | xargs -0 -n 1 my_command


답변

그러면 서브 쉘이 생성됩니다 (즉, while루프가 종료 될 때 변수 값이 손실 됨 ).

find . -type d | while read -r dir
do
    something
done

이것은하지 않습니다 :

while read -r dir
do
    something
done < <(find . -type d)

디렉토리 이름에 공백이 있으면 둘 중 하나가 작동합니다.