2012-01-17 11 views
1

ディレクトリを移動してファイルの名前を変更するスクリプトを作成しようとしています。私はファイル名とファイル拡張子を別々に抽出できるようにしたいと思いますが、ファイルパスにスペースやスウェーデン語のUTF8文字(ÅÄÖなど)が含まれていると、壊れます。bashでUTF文字を操作する

私はここでファイル名+拡張子を抽出するために以下のスニペットを見つけましたが、UTF-charsや空白のないパスで動作しているのを見ているので、私は適切にエスケープしていないと思っています変数。

おそらく私は何か間違っています。 UTF8の文字と空白を持つパスでこの作業をするために私が何をできるかについてのアイデアはありますか?

for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do 

    FULLPATH="$file" 
    FILENAME=${FULLPATH##*/} 
    FILEEXTENSION=${FILENAME##*.} 
    BASEDIRECTORY=${FULLPATH%$FILENAME} 

    #Log the vars for debugging 
    echo "$FULLPATH" >> ~/Desktop/log.txt 
    echo "$FILENAME" >> ~/Desktop/log.txt 
    echo "$FILEEXTENSION" >> ~/Desktop/log.txt 
    echo "$BASEDIRECTORY" >> ~/Desktop/log.txt 

done 
+0

あなたが投稿スニペットは結構ですが、 '$ NAUTILUS_SCRIPT_SELECTED_FILE_PATHS'は、複数のパス、引用されたそれらのいくつかを含めることができる方法はありません。この変数を避ける方法はありますか? – tripleee

+0

...まあ、もちろん不可能ではありませんが、おそらくあなたの問題の原因です。 – tripleee

答えて

2

問題がNAUTILUS_SCRIPT_SELECTED_FILE_PATH変数がnew-line escaped per itemであるということです。

あなたは使用する必要があります。

while read file; do 

    FULLPATH="$file" 
    FILENAME=${FULLPATH##*/} 
    FILEEXTENSION=${FILENAME##*.} 
    BASEDIRECTORY=${FULLPATH%$FILENAME} 

    #Log the vars for debugging 
    echo "$FULLPATH" >> ~/Desktop/log.txt 
    echo "$FILENAME" >> ~/Desktop/log.txt 
    echo "$FILEEXTENSION" >> ~/Desktop/log.txt 
    echo "$BASEDIRECTORY" >> ~/Desktop/log.txt 

done <<<"$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" 
+0

+1コメントする前にNAUTILUS_SCRIPT_SELECTED_FILE_PATHを読んでいない。 – tripleee

0

私はmy dotfilesでこれを持っている。そのような構成により

# Prefer US English and use UTF-8 
export LC_ALL="en_US.UTF-8" 
export LANG="en_US" 

、動作しているようです:

$ ls -l 
total 0 
drwxr-xr-x 2 Mathias staff 68 Jan 17 11:32 test space test 
drwxr-xr-x 2 Mathias staff 68 Jan 17 11:29 test©test 
$ for file in *; do echo "$file"; done 
test space test 
test©test