특정 폴더의 모든 하위 디렉토리에서 작업을 수행 해야하는 스크립트를 작성 중입니다.
그것을 작성하는 가장 효율적인 방법은 무엇입니까?
답변
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)
디렉토리 이름에 공백이 있으면 둘 중 하나가 작동합니다.