나는 내 스크립트를 "완벽하게" 만드는 방법을 배우고 있습니다. 현재 폴더의 파일을 수정하는 일부 스크립트가 있지만 스크립트 자체도 수정합니다. 나는 이 모든 것이 "for" 루프와 내가 알아낼 수 없는 "찾기"로 귀결된다는 것을 알고 있습니다.
for f in $(find . -type f | grep -v $0)
내 목표는 현재 디렉터리와 하위 디렉터리에서 찾을 수 있는 모든 파일을 포함하되 실행된 스크립트 자체는 제외하는 것입니다. grep -v와 함께 작동하지만 이제는 스크립트 이름이 포함된 모든 파일(예: 하위 폴더의 스크립트 복사본)을 제외합니다. 실행된 스크립트에서만 작동하도록 하는 방법을 아는 사람이 있습니까? 누군가가 어느 시점에서 이름을 변경할 수 있다고 가정해야 하므로 수동으로 제외하는 것은 불가능합니다.
답변1
이 방법의 예 find . -type f ! -path $0
. 스크립트가 foo.sh
보고하는 방식에 유의하세요."디"목차. foo.sh
현재 디렉터리에 없습니다 .
$ find . -print
.
./a
./b
./c
./foo.sh
./d
./d/foo.sh
$ cat foo.sh
#!/bin/bash
for f in $(find . -type f ! -path $0); do
echo $f
done
$ ./foo.sh
./a
./b
./c
./d/foo.sh
$
아니면 시도해 보세요for f in $(find . -type f | grep -v "^\./foo\.sh$"); do
답변2
무엇이 잘못됐나요:
for f in $(find . -type f); do
case $f in
*/$0|$0)
continue
;;
*)
echo 'Do something'
;;
esac
fi
done