입력 매개변수를 확인하고 적절한 조치를 수행합니다.

입력 매개변수를 확인하고 적절한 조치를 수행합니다.

내 스크립트에는 두 개의 입력이 필요합니다. 하나는 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. BSD의 경우 (호출하기 전에) 다음을 수행하여 이 문제를 해결할 수 있습니다 .-deletethat-script name -deletefindfind

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.

관련 정보