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