Bash를 사용하여 모든 하위 디렉토리에서 작업 수행
특정 폴더의 모든 하위 디렉터리에서 작업을 수행해야 하는 스크립트를 작성하고 있습니다.
그것을 쓰는 가장 효율적인 방법은 무엇입니까?
하위 프로세스를 만들지 않는 버전:
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 $(find . -mindepth 1 -maxdepth 1 -type d); do
//Do whatever you need with D
done
가장 간단한 비재귀적 방법은 다음과 같습니다.
for d in */; do
echo "$d"
done
그/
마지막에 디렉토리만 사용합니다.
할 필요가 없습니다
- 찾아내다
- 어색한
- ...
사용하다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 d in */; { echo "$d"; }
재귀성의 경우 확장 글로빙(**/
대신 (사용 가능:shopt -s extglob
).
자세한 내용은 각 디렉토리로 이동하여 명령을 실행하는 방법을 참조하십시오.SO에서
편리한 한 줄기
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)
디렉토리 이름에 공백이 있는 경우 둘 중 하나가 작동합니다.
시도해 볼 수 있습니다.
#!/bin/bash
### $1 == the first args to this script
### usage: script.sh /path/to/dir/
for f in `find . -maxdepth 1 -mindepth 1 -type d`; do
cd "$f"
<your job here>
done
아니면 그와 비슷한...
설명:
find . -maxdepth 1 -mindepth 1 -type d
최대 재귀 깊이가 1이고 최소 깊이가 1인 디렉토리만 찾습니다(현재 폴더 제외)..
)
디렉토리 이름에 공백이 있는 경우 허용된 답변은 공백으로 구분되며, 선호되는 구문은 다음과 같습니다.$()
바쉬/크쉬를 위한사용하다GNU find
-exec
에 대한 옵션.+;
예를 들어
find .... -exec mycommand +;
#this is same as passing to xargs
또는 시간 루프를 사용합니다.
find .... | while read -r D
do
# use variable `D` or whatever variable name you defined instead here
done
폴더가 아닌 폴더 내부에서 작업을 수행하려는 경우.
설명:pdf가 여러 개 있고 단일 폴더 내에 통합하려고 합니다. 내 폴더
AV 001/
AV 002/
for D in *; do cd "$D";
매우 위험한 명령 - #-- 누락된 ""를 사용하지 마십시오. 파일도 나열됩니다.올라갈 수도 있어요.for d in */; do cd "$d"; echo $d; cd ..; done;
성공적으로 작동합니다.for D in "$(ls -d */)"; do cd "$D"; done;
bash: cd: $'Atens Voice 001/\nAtens Voice 002/' - 이러한 폴더가 없습니다.for D in "$(*/)"; do cd "$D"; done;
bash:아테네 음성 001/: is 폴더for D in "$(`find . -type d`)"; do cd $D; done;
bash: ./Atens: 이러한 폴더 또는 파일이 없습니다.for D in *; do if [ -d "${D}" ] then cd ${D}; done;
많은 논거
언급URL : https://stackoverflow.com/questions/4000613/perform-an-action-in-every-sub-directory-using-bash
'programing' 카테고리의 다른 글
테이블에 트리거 SQL 서버 사용 안 함 (0) | 2023.05.01 |
---|---|
bash에서 모든 하위 디렉터리의 모든 파일을 하나의 압축 파일로 gzip하는 방법 (0) | 2023.04.26 |
동일한 요소에서 *ngIf 및 *ngFor로 인해 오류 발생 (0) | 2023.04.26 |
셸에서 배열의 길이를 찾는 방법은 무엇입니까? (0) | 2023.04.26 |
Windows 탐색기를 열고 파일 선택 (0) | 2023.04.26 |