Bash에서 프로그램 매개변수를 사용하여 조회에서 파일/디렉터리를 제외하는 방법은 무엇입니까?

Bash에서 프로그램 매개변수를 사용하여 조회에서 파일/디렉터리를 제외하는 방법은 무엇입니까?

내가 찾은 것은 간단해 보입니다.

find . -type f

프로그램 매개변수 행을 기반으로 특정 파일이나 디렉터리를 제외하는 방법을 알아내려고 합니다.

bash myscript.sh -excl a b c d 

또는 옵션 a, b, c, d의 다음 인수는 excl제외하려는 특정 파일이나 디렉터리를 참조하는 정규식입니다.

따라서 프로그램을 다음과 같이 호출하면:

bash myscript.sh -excl *.sh somedir

나는 somedir 디렉토리와 확장자를 가진 모든 파일을 무시하고 싶습니다 .sh. 배쉬에서 이것이 가능합니까?

답변1

배열을 사용한 bash솔루션 :

#!/bin/bash

declare -a find_arguments=( -type f )

for arg; do

  find_arguments+=( ! -name "$arg" )

done

find . "${find_arguments[@]}"

정말로 정규식을 원한다면 그렇게 하십시오. -name그러나 -regex예를 보면 와일드카드를 원하는 것처럼 보입니다. (POSIX는 아니지만 -regexGNU에서는 지원됩니다 find.)

데모

touch {a,b,c}{x,y,z}
./myscript.sh 'a*' '*z'

산출:

./bx
./by
./cx
./cy

명령줄 구문 분석 -excl등은 스크립트의 명령줄 옵션이 일반적으로 어떻게 보이는지 명확하게 밝히지 않았기 때문에 생략했습니다. 그렇다면 -excl간단히 확인하면 됩니다( [[ "$1" = -excl ]]) shift.

답변2

-not -name예, 스크립트에 두 번째 매개변수가 있는 경우 매개변수를 추가할 수 있습니다.

#!/bin/bash 

targetDir="$1"
exclude="$2"

findString=" '$targetDir'"

if [[ ! -z "$exclude" ]]; then
        findString="$findString -not -name '$exclude'"
fi
eval "find $findString"

예를 들어:

$ ls
file1  file1.sh  file2  file2.sh  file3.sh  file4.sh  file5.sh
$ foo.sh .
.
./file1
./file2
./file1.sh
./file4.sh
./file3.sh
./file5.sh
./file2.sh
$ foo.sh . '*sh'
.
./file1
./file2

제외할 여러 패턴을 정의하려면 다음을 수행하세요.

#!/bin/bash 

targetDir="$1"
findString=" '$targetDir'"
shift
exclude="'$1'"
shift
for i in "$@"; do
        exclude="$exclude -a -not -name '$i'";
done
if [[ ! -z "$exclude" ]]; then
        findString="$findString -not -name $exclude"
fi
eval "find $findString"

관련 정보