programing

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

linuxpc 2023. 4. 26. 23:03
반응형

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

반응형