"if" 및 "and" 문과 함께 "찾기" 명령 사용

"if" 및 "and" 문과 함께 "찾기" 명령 사용

특정 파일이 포함된 하위 디렉터리를 검색하고 찾아야 하는데, 이 특정 파일과 다른 파일이 포함되어 있으면 목록에 표시되는 것을 원하지 않습니다.

진술은 다음과 같습니다.

  1. "password.old" 파일이 포함된 디렉토리를 찾으세요.
  2. 디렉토리에 "password.old" 및 "webvirtual"이 포함되어 있으면 나열하지 마십시오.
  3. 디렉터리에 "webvirtual"이 없고 "password.old"만 포함된 경우 디렉터리 경로를 > OLD.TXT 파일로 출력합니다.

이것이 내가 현재 갖고 있는 것에 모두 문제가 있는 걸까요? 잘 작동하는 것 같지만 저는 bash 스크립팅을 처음 접했고 아무것도 누락되지 않았는지 확인하고 싶었습니다. 아니면 이 문제를 처리하는 더 좋은 방법이 있을까요?

#!/bin/sh
if FILE=$(find ./ -path OLD/ -prune -o -name "password.old") && FILE=$(find ./ -path OLD/ -prune -o -name "webvirtual*")
then
printf %"s\n" $FILE > Not_Old_Ones.txt
fi
if FILE=$(find ./ -path OLD/ -prune -o -name "password.old") && FILE=$(find ./ -path OLD/ -prune -o ! -name "webvirtual*")
then
printf %"s\n" $FILE > Old_Ones.txt
fi

답변1

나는 그것을 할 것이다:

find . -path ./OLD -prune -o -name password.old \
  ! -execdir [ -e webvirtual ] \; -printf '%h\n'

-execdirGNU find(4.2.12(2005) 기준) sfind및 대부분의 BSD(파생됨)에 존재합니다. -printfGNU에만 해당됩니다. -execdir pwd \;다른 find구현 으로 대체할 수 있습니다 .

-execdir사용할 수 없는 경우 :

find . -path ./OLD -prune -o -name password.old -exec sh -c '
  for file do
    dir=${file%/*}
    [ -e "$dir/webvirtual" ] || printf "%s\n" "$dir"
  done' sh {} +

위의 내용은 POSIX입니다. Solaris 10 이하에서는 의 표준 대신 sh의 표준을 사용해야 합니다 ./usr/xpg4/bin/bin

답변2

약간 길지만 -execdir사용할 수 없는 경우에 작동하는 실행 가능한 솔루션은 다음과 같습니다.

$ tree
.
├── dir_one
│   ├── password.old
│   └── webvirtual
└── dir_two
    └── password.old
$ find . -iname "*password.old" -exec dirname "{}" \; 2>/dev/null | while IFS= read -r directory; do
> [ -e "$directory"/webvirtual ] && continue || echo "$directory"
> done
./dir_two

따라서 지금 해야 할 일은 > OLD.txt명령문 끝에 done파일에 리디렉션 출력을 추가하는 것뿐입니다.

dirname명령을 사용할 수 없는 경우 다음 스크립트를 사용하고 디렉터리를 인수로 전달할 수 있습니다.

#!/bin/sh

find "$1" -type f -iname "*password.old"  -printf "%h\n" |
while IFS= read -r directory;
do
    [ -e "$directory"/webvirtual ] && continue || echo "$directory"
done

예를 들어:

$ ./find_missing_webvirtual.sh ./TESTDIR/                                                                                
./TESTDIR/dir_two

관련 정보