특정 파일이 포함된 하위 디렉터리를 검색하고 찾아야 하는데, 이 특정 파일과 다른 파일이 포함되어 있으면 목록에 표시되는 것을 원하지 않습니다.
진술은 다음과 같습니다.
- "password.old" 파일이 포함된 디렉토리를 찾으세요.
- 디렉토리에 "password.old" 및 "webvirtual"이 포함되어 있으면 나열하지 마십시오.
- 디렉터리에 "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'
-execdir
GNU find
(4.2.12(2005) 기준) sfind
및 대부분의 BSD(파생됨)에 존재합니다. -printf
GNU에만 해당됩니다. -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