모든 하위 디렉터리를 반복하고 Unix 쉘 스크립트에서 일부 작업을 수행합니다.

모든 하위 디렉터리를 반복하고 Unix 쉘 스크립트에서 일부 작업을 수행합니다.

내 쉘 스크립트가 내 홈 디렉토리 내의 모든 하위 디렉토리에 액세스할 수 있기를 원합니다. 디렉터리에서 일부 작업을 수행하고 출력을 스풀 파일로 보낸 후 다음 디렉터리로 이동합니다. 기본 디렉터리 = /tmp 하위 디렉터리 = ABCD(하위 디렉터리 4개)를 고려하세요.

답변1

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디렉토리에 대한 심볼릭 링크도 고려하고 숨겨진 심볼릭 링크는 제외합니다.)

답변2

저는 완전 bash초보자이지만 UN*X 베테랑입니다. Bash 쉘 스크립트에서 이 작업을 수행할 수 있다는 데는 의심의 여지가 없지만 find [-maxdepth <levels>] <start-dir> -exec <command> ;과거에는 그렇게 했습니다. 누군가가 방법을 알려줄 때까지 하나 만들어서 man find시도해 볼 수도 있습니다 bash!

답변3

각 하위 디렉터리 아래의 파일 이름이 충분하지 않은 것 같습니다. ls -l | awk해당 파일 이름에 공백 및/또는 개행 문자가 포함되어 있으면 어떻게 됩니까? 우연히 일하지 않는 사람들에게도 다음이 find적용됩니다.find-maxdepth

find . ! -name . -type d -prune -exec sh -c '
   cd "$1" && \
   find "." ! -name . -prune  -type f
' {} {} \;

답변4

나는 해결책을 얻었다. 아래의 find 명령은 내 요구 사항을 충족합니다.

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;

관련 정보