2017-12-13 2 views
4

파일이있는 경우 파일이 존재하고 파일 이름이 $ (printf '% q' "$ FNAME") 으로 항상 이스케이프 처리됩니다. 아래의 주석 된 예와 같이 [-f $ FNAME] 인 경우 을 사용하여 오류가 발생합니다. 공백과 다른 문자가 포함 된 파일 이름을 테스트하려면 어떻게해야합니까?Bash - 파일 이름에 공백이있는 파일이 있는지 확인하십시오.

#!/usr/bin/env bash 

# code used in Raspberry Pi Podcasting Jukebox project 
# youtube-dl -f 17 --get-filename https://www.youtube.com/watch?v=AgkM5g_Ob-w 
# returns "HOW ABUNDANCE WILL CHANGE THE WORLD - Elon Musk 2017-AgkM5g_Ob-w.3gp" 

# Purpose: To test if file exists before downloading 
# for testing purposes using an existing regular file "abc def ghi" 
AFILE="abc def ghi" 
TFILE=$(printf '%q' "$AFILE") # Escaping filename using printf 
echo $TFILE # returns abc\ def\ ghi 
# if [ -f $AFILE ] # this test returns false every time with error [:too many arguments 

if [ -f $TFILE ] # This test also returns FALSE with err [: too many arguments 
then 
    echo "Existing" 
    # don't download 
else 
    echo "Not existing" 
    # youtube-dl http://www.youtube.com/watch?v=AgkM5g_Ob-w 
fi 

편집 :이 질문에 대한 해결책은 항상 파일 이름, 탈출을 위해 %q을 사용하는 아이디어를 인용 [[]]

+0

[공백이있는 배시 및 파일 이름] 가능한 복제본 (https://stackoverflow.com/questions/1574898/bash-and-filenames-with-spaces) –

+0

예, 비슷한 질문이지만 공백이있는 배쉬 및 파일 이름 ] (https://stackoverflow.com/questions/1574898/bash-and-filenames-with-spaces)에는 테스트를 Bash에서 [[]]을 통해 표현식을 작성하는 특정 문제에 대한 해결책이 포함되어 있지 않습니다. – casperl

답변

5

을 통해 배쉬에서 표현 실행 조건 시험을 만드는 특정 문제에 관한 공백은 맞지만, 연산자와 함께 사용하면 인용 부호가없는 $TFILE은 여러 단어로 나뉘어 -f 피연산자가 실제로 단일 인수를 기대할 때 너무 많은 인수를 받도록합니다. 그래서 일단 큰 따옴표를 사용하면 공백이 보존되고 리터럴 단일 인수가 조건부로 전달됩니다.

testFile="abc def ghi" 
printf -v quotedFile '%q' "$testFile" 

if [ -f "$quotedFile" ]; then 
    printf 'My quoted file %s exists\n' "$quotedFile" 
fi 

은 위의 모든 POSIX 호환 쉘에서 잘 ( [의 사용) 적용해야합니다. 그러나 bash 쉘만위한 스크립트를 목표로한다면 [[을 사용할 수 있습니다.이 경우 표현식으로 평가 될 때 따옴표가 필요하지 않습니다. 그래서 당신은

file_with_spaces="abc def ghi" 
if [[ -f $file_with_spaces ]]; then 
    printf 'My quoted file %s exists\n' "$file_with_spaces" 
fi 

을 할 수 그러나 일반적으로는 bash 변수에 따옴표를 추가 할 다치게하지 않습니다. 당신은 항상 그것을 할 수 있습니다.

+1

A 자세한 설명, 나는 미래에 배쉬 변수를 인용 할 것이다. 대상 플랫폼이 Raspbian/Wheezy를 사용하는 Raspberry Pi이기 때문에 나는 Bash에 한정되어 있으며 Bash 예제가 완벽하게 작동합니다. – casperl

관련 문제