몇몇 디렉토리를 제외한 모든 디렉토리의 파일을 나열하는 쉘 스크립트 작성

몇몇 디렉토리를 제외한 모든 디렉토리의 파일을 나열하는 쉘 스크립트 작성

하위 디렉터리도 포함하는 각 디렉터리의 파일을 나열하고 싶습니다. 디렉터리 내에서는 여러 디렉터리를 무시해야 하며 상위 디렉터리이거나 하위 디렉터리일 수 있습니다. 아래 스크립트에서는 다른 디렉터리를 반복하지 않고 한 디렉터리의 파일만 나열할 수 있습니다. 이 문제를 해결하는 방법을 알려주십시오.

내가 시도한 스크립트

#!/bin/sh
find * -type d | while IFS= read d; do
    dirname=`basename $d`
        if [ ${dirname} != "Decommissioned" ]; then
          cd $dirname
          find * ! -name . -prune -type f | while read fname; do
             fname=`basename $fname`
             echo $fname
          done
        else
           continue
        fi
done

답변1

모든 일반 파일을 나열하고 다음 디렉터리의 파일을 건너뛰고 싶은 경우은퇴, 당신은 할 것입니다 :

find . -name Decommissioned -type d -prune -o -type f -print

GNU의 기본 이름만 사용하려면 . 또는 POSIXly 로 find바꿀 수 있습니다 .-print-printf '%f\n'

find . -name Decommissioned -type d -prune -o -type f -exec sh -c '
  for file do;
    printf "%s\n" "${file##*/}"
  done' sh {} +

또는 모든 파일 이름에 개행 문자가 포함되지 않는다고 보장할 수 있는 경우:

find . -name Decommissioned -type d -prune -o -type f -print |
  awk -F / '{print $NF}'

답변2

아래 코드는 "Decommissioned" 디렉터리를 무시하고 다른 디렉터리의 파일을 나열합니다.

find . -type d | while read DirName
do
   echo "${DirName}" | grep "Decommissioned" >/dev/null 2>&1
   if [ "$?" -ne "0" ]
   then
        find ${DirName} -type f | awk -F/ '{print $NF}'
   fi
done

댓글을 바탕으로 답변

bash-4.1$ find .
.
./c
./c/c.txt
./c/c2
./c/c2/c2.txt
./c/c1
./c/c1/c1.txt
./a
./a/a.txt
./a/a2
./a/a2/a2.txt
./a/a1
./a/a1/a1.txt
./b
./b/b2
./b/b2/b2.txt
./b/b1
./b/b1/b1.txt
./b/b.txt

bash-4.1$ find . | grep -vE "a/|b2" | grep "\.txt"
./c/c.txt
./c/c2/c2.txt
./c/c1/c1.txt
./b/b1/b1.txt
./b/b.txt

관련 정보