입력 매개변수를 확인하고 그에 따라 실행하십시오.

입력 매개변수를 확인하고 그에 따라 실행하십시오.

내가 가지고 있는 스크립트에는 두 개의 입력이 필요합니다. 하나는 find 명령을 사용하여 파일의 존재를 확인하는 데 사용되는 것입니다 filepath.filename

#!/bin/bash

Filepath=$1
Filename=$2

if [ -z "$Filepath" ] && [ -z "$Filename" ]
then
        echo "Requires Input"
elif [ ! -z "$Filepath" ] && [ ! -z "$Filename" ]
then
        Found=`find "$Filepath" -iname "$Filename"`
                if [ -z "$Found" ]
                then
                        echo "Not Found"
                else
                        echo $Found
                fi
fi

이것은 예상대로 완전히 잘 작동합니다. 나중에 이 스크립트에 몇 가지 조건을 더 추가해야 했습니다. 즉, filename입력 매개변수로만 얻는 경우 아래와 같이 전체 파일 시스템에서 해당 파일을 검색하게 됩니다.

find / -iname "$Filename"

그리고 입력 매개변수만 이 스크립트에 전달되는 경우 filepath파일 이름 매개변수도 필요하다는 것을 에코해야 하거나 그냥 나와야 합니다.

답변1

나는 할 것이다:

#! /bin/sh -
pattern=${1?Please provide a file name}
shift

[ "$#" -gt 0 ] || set /

find "$@" -iname "$pattern" | grep '^' && exit

echo >&2 "Not found"
exit 1

즉, 통과이름( 찾을 정확한 파일 이름이 아니라 파일 이름과 일치하는 패턴 find으로 (때문에 대소문자를 구분하지 않음) 처리합니다)를 첫 번째 인수로 사용합니다. -iname다른 인수는 검색할 디렉터리나 파일이며, 아무것도 지정되지 않은 경우 에서 검색합니다 /.

출력을 변수에 저장하고 마지막에 표시하는 대신 grep통과로 사용하여 파일이 발견되면 true를 보고합니다.

또한 stdout 대신 stderr에 "찾을 수 없음" 메시지를 출력하고 종료 상태에서 파일을 찾지 못했다고 보고합니다.

@ThomasN이 언급한 것처럼 파일/디렉토리 이름을 find. 라는 디렉토리에서 검색하려는 경우 예를 들어 -delete호출하면 that-script name -delete재앙적인 결과가 발생할 수 있습니다. BSD를 사용하면 (호출하기 전에 ) find다음을 수행하여 문제를 해결할 수 있습니다 .find

for i do
  set -- "$@" -f "$i"
  shift
done

이식 가능하지만(이식 가능하지는 않지만) 다음과 같이 문제가 될 수 있는 상대 경로를 -iname앞에 추가해야 합니다 ../

for i do
  case $i in
    (. | ./* | /*) ;; # /foo, ./foo are not a problem
    (*) i=./$i
  esac
  set -- "$@" "$i"
  shift
done
find "$@"...

하지만 이는 출력에 영향을 미칩니다( ./delete/name대신에 표시되는 것처럼 -delete/name).

관련 정보