입력 문자열이 파일 이름을 참조하는지 확인하고 싶습니다.아니요와일드카드 문자열 *.txt
(예:
이것은 작동하지 않습니다:
if [ -f "$1" ];
$1
로 확장되면 *.txt
으로 확장되기 때문에 foo.txt bar.txt
으로 전달됩니다 test -f
.
와일드카드를 명시적으로 확인하는 것 외에 쉘 대체를 수행하고 와일드카드를 방지하는 일반적인 방법이 있습니까?
답변1
아니요, 글로브는아니요견적을 확장하면 다음과 같습니다.
set -- '*.txt'
[ -f "$1" ]
현재 디렉토리에서 호출된 파일이 *.txt
일반 파일인지 일반 파일에 대한 심볼릭 링크인지 확인합니다.
[ -f $1 ]
이것은 문제가 될 것입니다( $1
단어 분할(여기서는 기본값으로 아무것도 하지 않음 $IFS
) 및 파일 이름 생성을 수행합니다).
확장자를 가진 일반 파일이 존재하는지 확인하려면 .txt
루프나 사용 find
또는 zsh
glob 한정자가 필요합니다.
set -- *.txt
for f do
if [ -f "$f" ]; then
echo "there is at least one regular file with a .txt extension here"
fi
done
또는 패턴이 다음에서 발견된 경우 $1
:
IFS= # disable the splitting part of the split+glob operator
set -- $1
for f do... # as above
zsh
:
files=(*.txt(N-.))
echo "$#files regular files with a .txt extension here"
find
:
find -L . ! -name . -prune ! -name '.*' -name '*.txt' -type f | grep -q . &&
echo there are regular .txt files in here