拡張子に基づいてファイルをソートするスクリプトは失敗します。

拡張子に基づいてファイルをソートするスクリプトは失敗します。

破損したディスクからファイルを回復していますが、dir1、dir2、...というフォルダにランダムに並べ替えられています。

拡張子に基づいてフォルダを並べ替えるスクリプトを作成しようとしています。

問題は、一部のファイルに拡張子がなく、スクリプトが実際にそのファイルを無視する必要がある場合に各ファイルのフォルダを作成することです。

これは私のコードです。

#!/bin/sh

BASEPATH=/media/potato/toshiba/WD320
SOURCEPATH=$BASEPATH/recovered/*
DESTINATIONPATH=$BASEPATH/sorted
DELIMITER="."

function iterateFolder {
    for filename in $1; do
            #checks if file is actually a folder
            #if it is a folder call this function again
            if [ -d $filename ] ;
            then
                    echo "iterating folder $filename"
                    iterateFolder "$filename/*"
            else            
                    #checks if the name of the file has extension ( actually it checks if there is "." in the name of the file)
                    #if it doesn't, ignore the file

                    if [ -z "${filename##*$DELIMITER*}" ] ;
                    then
                            fileExtension="${filename##*.}"
                            #checks if already exists a folder in the destination folder with the name of the extension
                            if [ ! -d "$DESTINATIONPATH/$fileExtension" ] ;
                            then
                                    newDir="$DESTINATIONPATH/$fileExtension"
                                    echo "creating folder $newDir"
                                    mkdir -p $newDir
                            fi
                    fi
            fi
    done
}
iterafteFolder "$SOURCEPATH"

答え1

あなたの間違いはすぐそこにありますif [ -z "${filename##*$DELIMITER*}" ] ;。演算子は、##文字列から項目を削除するために正確な一致を実行する必要があります。したがって、ファイル名にaが含まれていないと変更されず、.条件が成功します##ifこれをシェルでテストできます。

$ foo=bar
$ if [ -z "${foo##*.*}" ]; then echo 'Yes'; fi
Yes
$

より伝統的なアプローチは、[[修飾子=~を使用して正規表現を検証することです。たとえば、

$ if [[ $foo =~ *.* ]]; then echo 'Yes'; else echo 'No'; fi
No
$

ここで詳細を学ぶことができます[[要点は、[[より強力で柔軟性があるが、シェル組み込みではなくシステムバイナリというコストがかかるため、新しいプロセスを開始すると理論的なパフォーマンスが低下することです。罰はほとんど微妙なので心配する必要はありません。

関連情報