내가 가지고 있는 스크립트에는 두 개의 입력이 필요합니다. 하나는 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
).