2017-12-13 9 views
4

ファイルが存在し、ファイル名がエスケープされている場合はBashでテストしています。$(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 

EDIT:この質問を解決するには、必ずファイル名、エスケープ用%qを使用してのアイデアを引用し、[[]]

+0

[Bashとファイル名の空白]の可能な複製(https://stackoverflow.com/questions/1574898/bash-and-filenames-with-spaces) –

+0

はい、同様の質問ですが、[スペースとBashとファイル名] [https://stackoverflow.com/questions/1574898/bash-and-filenames-with-spaces]には、テストをBashで[[]]を通して式を指定する特定の問題の解決策が含まれていません – casperl

答えて

5

を通じてバッシュで表現conditonのテストを行うの特定の問題を懸念しましたスペースは正しくありますが、演算子で使用すると、引用符なしの$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

非常に詳細な説明、私は将来バッシュ変数を引用します。ターゲットプラットフォームはRaspbian/Wheezyを使用したRaspberry Piですから、私はBashに限られています。 – casperl